@tacdaed/fragments 1.0.0-beta.0 → 1.0.0-beta.2

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 (248) hide show
  1. package/README.md +2 -18
  2. package/ng-package.json +25 -0
  3. package/package.json +22 -29
  4. package/src/lib/components/accordion/accordion.component.html +103 -0
  5. package/src/lib/components/accordion/accordion.component.scss +382 -0
  6. package/src/lib/components/accordion/accordion.component.spec.ts +147 -0
  7. package/src/lib/components/accordion/accordion.component.ts +211 -0
  8. package/src/lib/components/accordion/accordion.type.ts +82 -0
  9. package/src/lib/components/breadcrumb/breadcrumb.component.html +43 -0
  10. package/src/lib/components/breadcrumb/breadcrumb.component.scss +112 -0
  11. package/src/lib/components/breadcrumb/breadcrumb.component.spec.ts +33 -0
  12. package/src/lib/components/breadcrumb/breadcrumb.component.ts +103 -0
  13. package/src/lib/components/breadcrumb/breadcrumb.interface.ts +7 -0
  14. package/src/lib/components/button/button.component.html +57 -0
  15. package/src/lib/components/button/button.component.scss +445 -0
  16. package/src/lib/components/button/button.component.spec.ts +99 -0
  17. package/src/lib/components/button/button.component.ts +143 -0
  18. package/src/lib/components/button/button.type.ts +7 -0
  19. package/src/lib/components/card/card.component.html +44 -0
  20. package/src/lib/components/card/card.component.scss +114 -0
  21. package/src/lib/components/card/card.component.spec.ts +65 -0
  22. package/src/lib/components/card/card.component.ts +21 -0
  23. package/src/lib/components/card/card.type.ts +3 -0
  24. package/src/lib/components/code-block/code-block.component.html +55 -0
  25. package/src/lib/components/code-block/code-block.component.scss +122 -0
  26. package/src/lib/components/code-block/code-block.component.spec.ts +81 -0
  27. package/src/lib/components/code-block/code-block.component.ts +302 -0
  28. package/src/lib/components/code-block/code-block.interface.ts +28 -0
  29. package/src/lib/components/code-block/code-block.type.ts +73 -0
  30. package/src/lib/components/decorative/sparkle-field/sparkle-field.component.html +14 -0
  31. package/src/lib/components/decorative/sparkle-field/sparkle-field.component.scss +20 -0
  32. package/src/lib/components/decorative/sparkle-field/sparkle-field.component.spec.ts +38 -0
  33. package/src/lib/components/decorative/sparkle-field/sparkle-field.component.ts +181 -0
  34. package/src/lib/components/input/input-base.ts +187 -0
  35. package/src/lib/components/input/input-calendar/input-calendar.component.html +76 -0
  36. package/src/lib/components/input/input-calendar/input-calendar.component.scss +179 -0
  37. package/src/lib/components/input/input-calendar/input-calendar.component.spec.ts +44 -0
  38. package/src/lib/components/input/input-calendar/input-calendar.component.ts +299 -0
  39. package/src/lib/components/input/input-checkbox/input-checkbox.component.html +37 -0
  40. package/src/lib/components/input/input-checkbox/input-checkbox.component.scss +128 -0
  41. package/src/lib/components/input/input-checkbox/input-checkbox.component.spec.ts +43 -0
  42. package/src/lib/components/input/input-checkbox/input-checkbox.component.ts +112 -0
  43. package/src/lib/components/input/input-checkbox-group/input-checkbox-group.component.html +43 -0
  44. package/src/lib/components/input/input-checkbox-group/input-checkbox-group.component.scss +140 -0
  45. package/src/lib/components/input/input-checkbox-group/input-checkbox-group.component.spec.ts +62 -0
  46. package/src/lib/components/input/input-checkbox-group/input-checkbox-group.component.ts +136 -0
  47. package/src/lib/components/input/input-clock-picker/input-clock-picker.component.html +81 -0
  48. package/src/lib/components/input/input-clock-picker/input-clock-picker.component.scss +228 -0
  49. package/src/lib/components/input/input-clock-picker/input-clock-picker.component.spec.ts +62 -0
  50. package/src/lib/components/input/input-clock-picker/input-clock-picker.component.ts +178 -0
  51. package/src/lib/components/input/input-consts.ts +132 -0
  52. package/src/lib/components/input/input-date/input-date-validators.ts +41 -0
  53. package/src/lib/components/input/input-date/input-date.component.html +41 -0
  54. package/src/lib/components/input/input-date/input-date.component.scss +95 -0
  55. package/src/lib/components/input/input-date/input-date.component.spec.ts +43 -0
  56. package/src/lib/components/input/input-date/input-date.component.ts +359 -0
  57. package/src/lib/components/input/input-date-time/input-date-time.component.html +70 -0
  58. package/src/lib/components/input/input-date-time/input-date-time.component.scss +133 -0
  59. package/src/lib/components/input/input-date-time/input-date-time.component.spec.ts +36 -0
  60. package/src/lib/components/input/input-date-time/input-date-time.component.ts +387 -0
  61. package/src/lib/components/input/input-file-upload/input-file-upload.component.html +89 -0
  62. package/src/lib/components/input/input-file-upload/input-file-upload.component.scss +171 -0
  63. package/src/lib/components/input/input-file-upload/input-file-upload.component.spec.ts +43 -0
  64. package/src/lib/components/input/input-file-upload/input-file-upload.component.ts +351 -0
  65. package/src/lib/components/input/input-interface.ts +8 -0
  66. package/src/lib/components/input/input-number/input-number-validators.ts +0 -0
  67. package/src/lib/components/input/input-number/input-number.component.html +51 -0
  68. package/src/lib/components/input/input-number/input-number.component.scss +140 -0
  69. package/src/lib/components/input/input-number/input-number.component.spec.ts +44 -0
  70. package/src/lib/components/input/input-number/input-number.component.ts +343 -0
  71. package/src/lib/components/input/input-radio-group/input-radio-group.component.html +44 -0
  72. package/src/lib/components/input/input-radio-group/input-radio-group.component.scss +139 -0
  73. package/src/lib/components/input/input-radio-group/input-radio-group.component.spec.ts +58 -0
  74. package/src/lib/components/input/input-radio-group/input-radio-group.component.ts +132 -0
  75. package/src/lib/components/input/input-slider/input-slider.component.html +111 -0
  76. package/src/lib/components/input/input-slider/input-slider.component.scss +203 -0
  77. package/src/lib/components/input/input-slider/input-slider.component.spec.ts +46 -0
  78. package/src/lib/components/input/input-slider/input-slider.component.ts +410 -0
  79. package/src/lib/components/input/input-text/input-text-validators.ts +67 -0
  80. package/src/lib/components/input/input-text/input-text.component.html +71 -0
  81. package/src/lib/components/input/input-text/input-text.component.scss +118 -0
  82. package/src/lib/components/input/input-text/input-text.component.spec.ts +55 -0
  83. package/src/lib/components/input/input-text/input-text.component.ts +215 -0
  84. package/src/lib/components/input/input-time/input-time-validators.ts +42 -0
  85. package/src/lib/components/input/input-time/input-time.component.html +92 -0
  86. package/src/lib/components/input/input-time/input-time.component.scss +191 -0
  87. package/src/lib/components/input/input-time/input-time.component.spec.ts +39 -0
  88. package/src/lib/components/input/input-time/input-time.component.ts +691 -0
  89. package/src/lib/components/input/input-toggle-switch/input-toggle-switch.component.html +36 -0
  90. package/src/lib/components/input/input-toggle-switch/input-toggle-switch.component.scss +121 -0
  91. package/src/lib/components/input/input-toggle-switch/input-toggle-switch.component.spec.ts +54 -0
  92. package/src/lib/components/input/input-toggle-switch/input-toggle-switch.component.ts +117 -0
  93. package/src/lib/components/input/input-type.ts +18 -0
  94. package/src/lib/components/input/input-validation/input-validation.component.html +19 -0
  95. package/src/lib/components/input/input-validation/input-validation.component.scss +39 -0
  96. package/src/lib/components/input/input-validation/input-validation.component.spec.ts +45 -0
  97. package/src/lib/components/input/input-validation/input-validation.component.ts +13 -0
  98. package/src/lib/components/input/input.pipe.ts +14 -0
  99. package/src/lib/components/layout/container/container.component.html +1 -0
  100. package/src/lib/components/layout/container/container.component.scss +33 -0
  101. package/src/lib/components/layout/container/container.component.ts +32 -0
  102. package/src/lib/components/layout/container/container.type.ts +1 -0
  103. package/src/lib/components/layout/divider/divider.component.html +1 -0
  104. package/src/lib/components/layout/divider/divider.component.scss +60 -0
  105. package/src/lib/components/layout/divider/divider.component.ts +38 -0
  106. package/src/lib/components/layout/divider/divider.type.ts +2 -0
  107. package/src/lib/components/layout/section/section.component.html +21 -0
  108. package/src/lib/components/layout/section/section.component.scss +43 -0
  109. package/src/lib/components/layout/section/section.component.ts +33 -0
  110. package/src/lib/components/layout/section/section.type.ts +2 -0
  111. package/src/lib/components/layout/separator/separator.component.html +9 -0
  112. package/src/lib/components/layout/separator/separator.component.scss +52 -0
  113. package/src/lib/components/layout/separator/separator.component.ts +25 -0
  114. package/src/lib/components/layout/separator/separator.type.ts +1 -0
  115. package/src/lib/components/loader/content-blur/content-blur.component.html +13 -0
  116. package/src/lib/components/loader/content-blur/content-blur.component.scss +43 -0
  117. package/src/lib/components/loader/content-blur/content-blur.component.spec.ts +42 -0
  118. package/src/lib/components/loader/content-blur/content-blur.component.ts +34 -0
  119. package/src/lib/components/loader/loader.type.ts +2 -0
  120. package/src/lib/components/loader/progress-bar/progress-bar.component.html +26 -0
  121. package/src/lib/components/loader/progress-bar/progress-bar.component.scss +151 -0
  122. package/src/lib/components/loader/progress-bar/progress-bar.component.spec.ts +47 -0
  123. package/src/lib/components/loader/progress-bar/progress-bar.component.ts +28 -0
  124. package/src/lib/components/loader/progress-bar/progress-bar.type.ts +8 -0
  125. package/src/lib/components/loader/pulse-loader/pulse-loader.component.html +12 -0
  126. package/src/lib/components/loader/pulse-loader/pulse-loader.component.scss +202 -0
  127. package/src/lib/components/loader/pulse-loader/pulse-loader.component.spec.ts +55 -0
  128. package/src/lib/components/loader/pulse-loader/pulse-loader.component.ts +73 -0
  129. package/src/lib/components/loader/pulse-loader/pulse-loader.type.ts +6 -0
  130. package/src/lib/components/loader/skeleton-loader/skeleton-loader.component.html +13 -0
  131. package/src/lib/components/loader/skeleton-loader/skeleton-loader.component.scss +113 -0
  132. package/src/lib/components/loader/skeleton-loader/skeleton-loader.component.spec.ts +37 -0
  133. package/src/lib/components/loader/skeleton-loader/skeleton-loader.component.ts +51 -0
  134. package/src/lib/components/loader/skeleton-loader/skeleton-loader.type.ts +6 -0
  135. package/src/lib/components/loader/spinner/spinner.component.html +20 -0
  136. package/src/lib/components/loader/spinner/spinner.component.scss +137 -0
  137. package/src/lib/components/loader/spinner/spinner.component.spec.ts +43 -0
  138. package/src/lib/components/loader/spinner/spinner.component.ts +32 -0
  139. package/src/lib/components/loader/spinner/spinner.type.ts +6 -0
  140. package/src/lib/components/modal/modal.component.html +47 -0
  141. package/src/lib/components/modal/modal.component.scss +139 -0
  142. package/src/lib/components/modal/modal.component.spec.ts +60 -0
  143. package/src/lib/components/modal/modal.component.ts +83 -0
  144. package/src/lib/components/modal/modal.type.ts +9 -0
  145. package/src/lib/components/morph/blob-moph/blob-moprh.component.spec.ts +79 -0
  146. package/src/lib/components/morph/blob-moph/blob-moprh.component.ts +96 -0
  147. package/src/lib/components/morph/blob-moph/blob-morph.component.html +34 -0
  148. package/src/lib/components/morph/blob-moph/blob-morph.component.scss +7 -0
  149. package/src/lib/components/morph/morph.abstract.ts +13 -0
  150. package/src/lib/components/pagination/pagination.interface.ts +4 -0
  151. package/src/lib/components/pagination/small-pagination/small-pagination.component.html +61 -0
  152. package/src/lib/components/pagination/small-pagination/small-pagination.component.scss +187 -0
  153. package/src/lib/components/pagination/small-pagination/small-pagination.component.spec.ts +88 -0
  154. package/src/lib/components/pagination/small-pagination/small-pagination.component.ts +177 -0
  155. package/src/lib/components/selection-lists/multi-select/multi-select.component.html +170 -0
  156. package/src/lib/components/selection-lists/multi-select/multi-select.component.scss +312 -0
  157. package/src/lib/components/selection-lists/multi-select/multi-select.component.spec.ts +61 -0
  158. package/src/lib/components/selection-lists/multi-select/multi-select.component.ts +372 -0
  159. package/src/lib/components/selection-lists/selection-list/selection-list.component.html +125 -0
  160. package/src/lib/components/selection-lists/selection-list/selection-list.component.scss +267 -0
  161. package/src/lib/components/selection-lists/selection-list/selection-list.component.spec.ts +66 -0
  162. package/src/lib/components/selection-lists/selection-list/selection-list.component.ts +315 -0
  163. package/src/lib/components/selection-lists/selection-lists-base.ts +35 -0
  164. package/src/lib/components/selection-lists/selection-lists-const.ts +17 -0
  165. package/src/lib/components/selection-lists/selection-lists-interface.ts +7 -0
  166. package/src/lib/components/selection-lists/selection-lists.type.ts +1 -0
  167. package/src/lib/components/side-nav/side-nav.component.html +101 -0
  168. package/src/lib/components/side-nav/side-nav.component.scss +295 -0
  169. package/src/lib/components/side-nav/side-nav.component.spec.ts +0 -0
  170. package/src/lib/components/side-nav/side-nav.component.ts +18 -0
  171. package/src/lib/components/side-nav/side-nav.type.ts +28 -0
  172. package/src/lib/components/snackbar/snackbar.component.html +33 -0
  173. package/src/lib/components/snackbar/snackbar.component.scss +195 -0
  174. package/src/lib/components/snackbar/snackbar.component.ts +112 -0
  175. package/src/lib/components/snackbar/snackbar.type.ts +27 -0
  176. package/src/lib/components/status/chip/chip.component.html +51 -0
  177. package/src/lib/components/status/chip/chip.component.scss +149 -0
  178. package/src/lib/components/status/chip/chip.component.spec.ts +62 -0
  179. package/src/lib/components/status/chip/chip.component.ts +83 -0
  180. package/src/lib/components/status/chip/chip.type.ts +42 -0
  181. package/src/lib/components/status/directives/badge/badge.directive.spec.ts +60 -0
  182. package/src/lib/components/status/directives/badge/badge.directive.ts +190 -0
  183. package/src/lib/components/status/directives/badge/badge.interface.ts +19 -0
  184. package/src/lib/components/status/pill/pill.component.html +40 -0
  185. package/src/lib/components/status/pill/pill.component.scss +113 -0
  186. package/src/lib/components/status/pill/pill.component.spec.ts +47 -0
  187. package/src/lib/components/status/pill/pill.component.ts +83 -0
  188. package/src/lib/components/status/pill/pill.type.ts +42 -0
  189. package/src/lib/components/status/status.interface.ts +57 -0
  190. package/src/lib/components/status/status.type.ts +62 -0
  191. package/src/lib/components/status/tag/tag.component.html +39 -0
  192. package/src/lib/components/status/tag/tag.component.scss +140 -0
  193. package/src/lib/components/status/tag/tag.component.spec.ts +47 -0
  194. package/src/lib/components/status/tag/tag.component.ts +83 -0
  195. package/src/lib/components/status/tag/tag.type.ts +42 -0
  196. package/src/lib/components/stepper/stepper.component.html +83 -0
  197. package/src/lib/components/stepper/stepper.component.scss +196 -0
  198. package/src/lib/components/stepper/stepper.component.ts +482 -0
  199. package/src/lib/components/stepper/stepper.type.ts +60 -0
  200. package/src/lib/components/table/table.component.html +438 -0
  201. package/src/lib/components/table/table.component.scss +259 -0
  202. package/src/lib/components/table/table.component.spec.ts +117 -0
  203. package/src/lib/components/table/table.component.ts +215 -0
  204. package/src/lib/components/table/table.enum.ts +4 -0
  205. package/src/lib/components/table/table.function.ts +47 -0
  206. package/src/lib/components/table/table.interface.ts +143 -0
  207. package/src/lib/components/table/table.pipe.ts +62 -0
  208. package/src/lib/components/table/table.type.ts +15 -0
  209. package/src/lib/components/tabs/tabs.component.html +88 -0
  210. package/src/lib/components/tabs/tabs.component.scss +305 -0
  211. package/src/lib/components/tabs/tabs.component.spec.ts +94 -0
  212. package/src/lib/components/tabs/tabs.component.ts +282 -0
  213. package/src/lib/components/tabs/tabs.type.ts +81 -0
  214. package/src/lib/components/title-bar/title-bar.component.html +21 -0
  215. package/src/lib/components/title-bar/title-bar.component.scss +139 -0
  216. package/src/lib/components/title-bar/title-bar.component.spec.ts +44 -0
  217. package/src/lib/components/title-bar/title-bar.component.ts +13 -0
  218. package/src/lib/components/toast/toast.component.html +36 -0
  219. package/src/lib/components/toast/toast.component.scss +241 -0
  220. package/src/lib/components/toast/toast.component.ts +165 -0
  221. package/src/lib/components/toast/toast.type.ts +37 -0
  222. package/src/lib/components/toast-stack/toast-stack.component.html +30 -0
  223. package/src/lib/components/toast-stack/toast-stack.component.scss +35 -0
  224. package/src/lib/components/toast-stack/toast-stack.component.ts +51 -0
  225. package/src/lib/consts/country-prefix.ts +244 -0
  226. package/src/lib/directives/tooltip/popover.directive.ts +274 -0
  227. package/src/lib/directives/tooltip/tooltip.directive.spec.ts +86 -0
  228. package/src/lib/directives/tooltip/tooltip.directive.ts +234 -0
  229. package/src/lib/directives/tooltip/tooltip.interface.ts +29 -0
  230. package/src/lib/directives/tooltip/tooltip.type.ts +9 -0
  231. package/src/lib/interfaces/common.interfaces.ts +4 -0
  232. package/src/lib/pipes/chunk.pipe.ts +16 -0
  233. package/src/lib/pipes/safe-html.pipe.ts +14 -0
  234. package/src/lib/pipes/sanitize-html.pipe.ts +23 -0
  235. package/src/lib/types/base.types.ts +23 -0
  236. package/src/lib/types/common.types.ts +98 -0
  237. package/src/lib/types/form.types.ts +5 -0
  238. package/src/lib/utils/common.utils.ts +53 -0
  239. package/src/lib/utils/date.utils.ts +474 -0
  240. package/src/lib/utils/number.utils.ts +16 -0
  241. package/src/lib/utils/uuid.utils.ts +39 -0
  242. package/src/public-api.ts +114 -0
  243. package/tsconfig.lib.json +17 -0
  244. package/tsconfig.lib.prod.json +10 -0
  245. package/tsconfig.spec.json +9 -0
  246. package/fesm2022/fragments.mjs +0 -8928
  247. package/fesm2022/fragments.mjs.map +0 -1
  248. package/index.d.ts +0 -3929
@@ -0,0 +1,112 @@
1
+ import { NgClass } from '@angular/common';
2
+ import { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';
3
+ import { SnackbarCloseEvent, TSnackbarCloseReason, TSnackbarPosition, TSnackbarSize, TSnackbarStyle } from './snackbar.type';
4
+
5
+ @Component({
6
+ selector: 'frg-snackbar',
7
+ imports: [NgClass],
8
+ templateUrl: './snackbar.component.html',
9
+ styleUrl: './snackbar.component.scss'
10
+ })
11
+ export class SnackbarComponent implements OnChanges, OnDestroy {
12
+ @Input() open: boolean = false;
13
+ @Input() message: string = '';
14
+ @Input() actionLabel: string = '';
15
+ @Input() styleType: TSnackbarStyle = 'default';
16
+ @Input() position: TSnackbarPosition = 'bottom-center';
17
+ @Input() size: TSnackbarSize = 'medium';
18
+ @Input() autoClose: boolean = true;
19
+ @Input() duration: number = 4000;
20
+ @Input() hasCloseButton: boolean = false;
21
+ @Input() ariaLabel: string = 'Notification';
22
+
23
+ @Output() closed = new EventEmitter<SnackbarCloseEvent>();
24
+ @Output() action = new EventEmitter<void>();
25
+
26
+ private closeTimerId: ReturnType<typeof setTimeout> | null = null;
27
+
28
+ get statusIconClass(): string | null {
29
+ switch (this.styleType) {
30
+ case 'info':
31
+ return 'fas fa-info-circle';
32
+ case 'success':
33
+ return 'fas fa-check-circle';
34
+ case 'warning':
35
+ return 'fas fa-exclamation-triangle';
36
+ case 'danger':
37
+ return 'fas fa-times-circle';
38
+ default:
39
+ return null;
40
+ }
41
+ }
42
+
43
+ get snackbarClassMap() {
44
+ return {
45
+ 'frg-snackbar--top-left': this.position === 'top-left',
46
+ 'frg-snackbar--top-center': this.position === 'top-center',
47
+ 'frg-snackbar--top-right': this.position === 'top-right',
48
+ 'frg-snackbar--bottom-left': this.position === 'bottom-left',
49
+ 'frg-snackbar--bottom-center': this.position === 'bottom-center',
50
+ 'frg-snackbar--bottom-right': this.position === 'bottom-right',
51
+ 'frg-snackbar--size-small': this.size === 'small',
52
+ 'frg-snackbar--size-medium': this.size === 'medium',
53
+ 'frg-snackbar--size-large': this.size === 'large',
54
+ 'frg-snackbar--primary': this.styleType === 'primary',
55
+ 'frg-snackbar--secondary': this.styleType === 'secondary',
56
+ 'frg-snackbar--tertiary': this.styleType === 'tertiary',
57
+ 'frg-snackbar--dark': this.styleType === 'dark',
58
+ 'frg-snackbar--light': this.styleType === 'light',
59
+ 'frg-snackbar--info': this.styleType === 'info',
60
+ 'frg-snackbar--success': this.styleType === 'success',
61
+ 'frg-snackbar--warning': this.styleType === 'warning',
62
+ 'frg-snackbar--danger': this.styleType === 'danger',
63
+ 'frg-snackbar--default': this.styleType === 'default'
64
+ };
65
+ }
66
+
67
+ ngOnChanges(changes: SimpleChanges): void {
68
+ if (changes['open'] || changes['autoClose'] || changes['duration']) {
69
+ this.syncAutoClose();
70
+ }
71
+ }
72
+
73
+ ngOnDestroy(): void {
74
+ this.clearCloseTimer();
75
+ }
76
+
77
+ onCloseClick(): void {
78
+ this.requestClose('close-button');
79
+ }
80
+
81
+ onActionClick(): void {
82
+ this.action.emit();
83
+ this.requestClose('action');
84
+ }
85
+
86
+ private syncAutoClose(): void {
87
+ this.clearCloseTimer();
88
+
89
+ if (!this.open || !this.autoClose || this.duration <= 0) {
90
+ return;
91
+ }
92
+
93
+ this.closeTimerId = setTimeout(() => {
94
+ this.requestClose('timeout');
95
+ }, this.duration);
96
+ }
97
+
98
+ private requestClose(reason: TSnackbarCloseReason): void {
99
+ if (!this.open) {
100
+ return;
101
+ }
102
+ this.clearCloseTimer();
103
+ this.closed.emit({ reason });
104
+ }
105
+
106
+ private clearCloseTimer(): void {
107
+ if (this.closeTimerId) {
108
+ clearTimeout(this.closeTimerId);
109
+ this.closeTimerId = null;
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,27 @@
1
+ import { TBaseSize, TBaseStyle } from '../../types/base.types';
2
+
3
+ export type TSnackbarStyle = Exclude<
4
+ TBaseStyle,
5
+ | 'outline-primary'
6
+ | 'outline-secondary'
7
+ | 'outline-tertiary'
8
+ | 'outline-dark'
9
+ | 'outline-light'
10
+ | 'outline-info'
11
+ | 'outline-success'
12
+ | 'outline-warning'
13
+ | 'outline-danger'
14
+ >;
15
+ export type TSnackbarSize = TBaseSize;
16
+ export type TSnackbarPosition =
17
+ | 'top-left'
18
+ | 'top-center'
19
+ | 'top-right'
20
+ | 'bottom-left'
21
+ | 'bottom-center'
22
+ | 'bottom-right';
23
+ export type TSnackbarCloseReason = 'close-button' | 'timeout' | 'programmatic' | 'action';
24
+
25
+ export interface SnackbarCloseEvent {
26
+ reason: TSnackbarCloseReason;
27
+ }
@@ -0,0 +1,51 @@
1
+ <span
2
+ class="frg-chip"
3
+ [ngClass]="[
4
+ 'frg-chip--' + style,
5
+ 'frg-chip--' + size,
6
+ disabled ? 'frg-chip--disabled' : '',
7
+ iconPosition === 'end' ? 'frg-chip--icon-end' : ''
8
+ ]"
9
+ >
10
+ @if(icon && iconPosition === 'start') {
11
+ <span class="frg-chip__icon">
12
+ <span class="frg-chip__icon-inner">
13
+ <i [class]="icon"></i>
14
+ </span>
15
+ </span>
16
+ }
17
+
18
+ @if(label) {
19
+ <span class="frg-chip__label">{{ label }}</span>
20
+ }
21
+
22
+ @if(icon && iconPosition === 'end') {
23
+ <span class="frg-chip__icon">
24
+ <span class="frg-chip__icon-inner">
25
+ <i [class]="icon"></i>
26
+ </span>
27
+ </span>
28
+ }
29
+
30
+ @if(removable) {
31
+ <button
32
+ type="button"
33
+ class="frg-chip__remove"
34
+ (click)="onRemove()"
35
+ [attr.aria-label]="'Remove ' + label"
36
+ >
37
+ <svg
38
+ class="frg-chip__remove-icon"
39
+ width="10"
40
+ height="10"
41
+ viewBox="0 0 14 14"
42
+ fill="none"
43
+ xmlns="http://www.w3.org/2000/svg"
44
+ >
45
+ <circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.2"/>
46
+ <path d="M5 5L9 9M9 5L5 9" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"></path>
47
+
48
+ </svg>
49
+ </button>
50
+ }
51
+ </span>
@@ -0,0 +1,149 @@
1
+ @use './../../../../../assets/styles/scss/variables' as *;
2
+ @use 'sass:color';
3
+
4
+ $chip-background: $color-light;
5
+ $chip-box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 1px 0px, rgba(0, 0, 0, 0.06) 0px 1px 1px 0px;
6
+
7
+ :host {
8
+ display: inline-block;
9
+
10
+ .frg-chip {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ gap: 0.35rem;
14
+ border-radius: 999px;
15
+ white-space: nowrap;
16
+ font-weight: 400;
17
+ cursor: default;
18
+ box-shadow: $chip-box-shadow;
19
+ transition: background-color 0.2s ease, color 0.2s ease, opacity 0.2s ease;
20
+
21
+ background-color: $chip-background;
22
+ color: $color-dark-soft;
23
+
24
+ &--sm {
25
+ font-size: 0.75rem;
26
+ padding: 0.12rem 0.55rem;
27
+ }
28
+
29
+ &--md {
30
+ font-size: 0.9rem;
31
+ padding: 0.2rem 0.8rem;
32
+ }
33
+
34
+ &--lg {
35
+ font-size: 1.1rem;
36
+ padding: 0.25rem 1.1rem;
37
+ }
38
+
39
+ &--primary {
40
+ color: $color-primary-dark;
41
+ }
42
+
43
+ &--secondary {
44
+ color: $color-secondary-dark;
45
+ }
46
+
47
+ &--tertiary {
48
+ color: $color-tertiary-dark;
49
+ }
50
+
51
+ &--info {
52
+ color: $color-info-dark;
53
+ }
54
+
55
+ &--warning {
56
+ color: $color-warning-dark;
57
+ }
58
+
59
+ &--danger {
60
+ color: $color-danger-dark;
61
+ }
62
+
63
+ &--success {
64
+ color: $color-success-dark;
65
+ }
66
+
67
+ &--dark {
68
+ color: $color-light;
69
+ background: $color-dark;
70
+ }
71
+
72
+ &--light {
73
+ color: $color-dark;
74
+ }
75
+
76
+ &__icon {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ font-size: 0.9rem;
81
+ }
82
+
83
+ &__icon-inner {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ vertical-align: middle;
88
+ }
89
+
90
+ &--icon-end {
91
+ .frg-chip__icon {
92
+ margin-left: 0.2rem;
93
+ margin-right: 0;
94
+ }
95
+ }
96
+
97
+ &__label {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ }
101
+
102
+ &__remove {
103
+ display: inline-flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ width: 1rem;
107
+ height: 1rem;
108
+ padding: 0;
109
+ background: transparent;
110
+ border: none;
111
+ cursor: pointer;
112
+ color: inherit;
113
+ transition: filter 0.3s ease-in-out;
114
+
115
+ &:hover {
116
+ filter: brightness(0.6);
117
+ }
118
+
119
+ &:focus-visible {
120
+ outline: 2px solid rgba($color-primary, 0.45);
121
+ outline-offset: 2px;
122
+ }
123
+
124
+ svg {
125
+ width: 0.875rem;
126
+ height: 0.875rem;
127
+ display: block;
128
+ fill: transparent;
129
+ pointer-events: none;
130
+ }
131
+ }
132
+
133
+
134
+ &--disabled {
135
+ opacity: 0.6;
136
+ cursor: not-allowed;
137
+
138
+ .frg-chip__remove {
139
+ cursor: not-allowed;
140
+ pointer-events: none;
141
+ color: inherit;
142
+ }
143
+
144
+ .frg-chip__icon {
145
+ opacity: 0.6;
146
+ }
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,62 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { By } from '@angular/platform-browser';
3
+ import { ChipComponent } from './chip.component';
4
+
5
+ describe('ChipComponent', () => {
6
+ let fixture: ComponentFixture<ChipComponent>;
7
+ let component: ChipComponent;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [ChipComponent]
12
+ }).compileComponents();
13
+
14
+ fixture = TestBed.createComponent(ChipComponent);
15
+ component = fixture.componentInstance;
16
+ });
17
+
18
+ it('renders the label', () => {
19
+ component.label = 'Active';
20
+
21
+ fixture.detectChanges();
22
+
23
+ const label = fixture.debugElement.query(By.css('.frg-chip__label'));
24
+ expect(label.nativeElement.textContent).toContain('Active');
25
+ });
26
+
27
+ it('renders icon on the start when configured', () => {
28
+ component.icon = 'fa fa-star';
29
+ component.iconPosition = 'start';
30
+
31
+ fixture.detectChanges();
32
+
33
+ const icon = fixture.debugElement.query(By.css('.frg-chip__icon i'));
34
+ expect(icon).toBeTruthy();
35
+ });
36
+
37
+ it('emits removed when removable and not disabled', () => {
38
+ const emitSpy = spyOn(component.removed, 'emit');
39
+ component.removable = true;
40
+ component.disabled = false;
41
+
42
+ fixture.detectChanges();
43
+
44
+ const removeButton = fixture.debugElement.query(By.css('.frg-chip__remove'));
45
+ removeButton.nativeElement.click();
46
+
47
+ expect(emitSpy).toHaveBeenCalledWith(component.id);
48
+ });
49
+
50
+ it('does not emit removed when disabled', () => {
51
+ const emitSpy = spyOn(component.removed, 'emit');
52
+ component.removable = true;
53
+ component.disabled = true;
54
+
55
+ fixture.detectChanges();
56
+
57
+ const removeButton = fixture.debugElement.query(By.css('.frg-chip__remove'));
58
+ removeButton.nativeElement.click();
59
+
60
+ expect(emitSpy).not.toHaveBeenCalled();
61
+ });
62
+ });
@@ -0,0 +1,83 @@
1
+ import { NgClass } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { generateUUID } from '../../../utils/uuid.utils';
4
+ import { Chip, TChipIconPosition, TChipSize, TChipType } from './chip.type';
5
+
6
+ /**
7
+ * TagComponent
8
+ *
9
+ * A small UI element used to display labeled statuses, metadata, or categories.
10
+ * Supports icons, removable behavior, disabled state, and standardized design-
11
+ * system styles and sizes. Implements the shared `Tag` interface to ensure
12
+ * consistency across all status-driven UI components (Tag, Badge, Chip, etc.).
13
+ */
14
+ @Component({
15
+ selector: 'frg-chip',
16
+ templateUrl: './chip.component.html',
17
+ styleUrls: ['./chip.component.scss'],
18
+ imports: [NgClass]
19
+ })
20
+ export class ChipComponent implements Chip {
21
+
22
+ /**
23
+ * Unique identifier for the chip.
24
+ * Automatically generated if not provided by the parent.
25
+ * Used primarily for tracking and removal events.
26
+ */
27
+ @Input() id: string = generateUUID();
28
+
29
+ /**
30
+ * Text content displayed inside the chip.
31
+ */
32
+ @Input() label?: string = '';
33
+
34
+ /**
35
+ * Visual style of the chip.
36
+ * Corresponds to design-system status color tokens.
37
+ * Example: 'primary', 'secondary', 'success', 'warning', etc.
38
+ */
39
+ @Input() style: TChipType = 'primary';
40
+
41
+ /**
42
+ * Size variant of the chip.
43
+ * Options follow the standardized sizing tokens: 'sm', 'md', or 'lg'.
44
+ */
45
+ @Input() size: TChipSize = 'md';
46
+
47
+ /**
48
+ * Optional icon class displayed before the label.
49
+ * Example: 'frg-icon-info', 'frg-icon-alert'.
50
+ */
51
+ @Input() icon: string | undefined = undefined;
52
+
53
+ /**
54
+ * Position of the icon
55
+ */
56
+ @Input() iconPosition: TChipIconPosition = 'end';
57
+
58
+ /**
59
+ * Whether the chip is disabled.
60
+ * Disables interactions and applies the disabled visual style.
61
+ */
62
+ @Input() disabled = false;
63
+
64
+ /**
65
+ * If true, displays a remove button allowing the chip to be dismissed.
66
+ */
67
+ @Input() removable = false;
68
+
69
+ /**
70
+ * Emits the ID of the chip when it is removed.
71
+ */
72
+ @Output() removed = new EventEmitter<string>();
73
+
74
+ /**
75
+ * Emits the `removed` event when the remove button is clicked,
76
+ * provided the chip is not disabled and removal is allowed.
77
+ */
78
+ onRemove(): void {
79
+ if (!this.disabled && this.removable) {
80
+ this.removed.emit(this.id);
81
+ }
82
+ }
83
+ }
@@ -0,0 +1,42 @@
1
+ import { StatusIndicator } from "../status.interface";
2
+ import { TBaseStatusIconPosition, TBaseStatusSize, TBaseStatusStyle } from "../status.type";
3
+
4
+ /**
5
+ * ChipType
6
+ *
7
+ * Alias for `TBaseStatusStyle`.
8
+ * Represents the visual style of a chip according to the design system.
9
+ * Example: 'primary', 'secondary', 'success', etc.
10
+ */
11
+ export type TChipType = TBaseStatusStyle;
12
+
13
+ /**
14
+ * ChipSize
15
+ *
16
+ * Alias for `TBaseStatusSize`.
17
+ * Defines the size of the chip. Options: 'sm', 'md', 'lg'.
18
+ */
19
+ export type TChipSize = TBaseStatusSize;
20
+
21
+ /**
22
+ * ChipIconPosition
23
+ *
24
+ * Alias for `TBaseStatusIconPosition`.
25
+ * Defines the icon position of the icon in the chip. Options: 'start' or 'end'.
26
+ */
27
+ export type TChipIconPosition = TBaseStatusIconPosition;
28
+ /**
29
+ * chip
30
+ *
31
+ * A UI element that extends the shared `StatusIndicator` interface.
32
+ * Represents a labeled status, optionally removable.
33
+ *
34
+ * @extends StatusIndicator
35
+ */
36
+ export interface Chip extends StatusIndicator {
37
+ /**
38
+ * If true, the tag can be removed by the user.
39
+ * Triggers the `removed` event in the component.
40
+ */
41
+ removable?: boolean;
42
+ }
@@ -0,0 +1,60 @@
1
+ import { Component } from '@angular/core';
2
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
3
+ import { By } from '@angular/platform-browser';
4
+ import { FrgBadgeDirective } from './badge.directive';
5
+ import { Badge } from './badge.interface';
6
+
7
+ @Component({
8
+ standalone: true,
9
+ imports: [FrgBadgeDirective],
10
+ template: `<button frgBadge [badge]="badge">Inbox</button>`
11
+ })
12
+ class TestHostComponent {
13
+ badge: Badge = { value: 3, style: 'primary', size: 'sm' };
14
+ }
15
+
16
+ describe('FrgBadgeDirective', () => {
17
+ let fixture: ComponentFixture<TestHostComponent>;
18
+ let component: TestHostComponent;
19
+
20
+ beforeEach(async () => {
21
+ await TestBed.configureTestingModule({
22
+ imports: [TestHostComponent]
23
+ }).compileComponents();
24
+
25
+ fixture = TestBed.createComponent(TestHostComponent);
26
+ component = fixture.componentInstance;
27
+ fixture.detectChanges();
28
+ });
29
+
30
+ it('adds the badge element with value', () => {
31
+ const badgeEl = fixture.debugElement.query(By.css('.frg-badge'));
32
+ expect(badgeEl).toBeTruthy();
33
+ expect(badgeEl.nativeElement.textContent).toContain('3');
34
+ });
35
+
36
+ it('hides the badge when value is null and dot is false', () => {
37
+ component.badge = { value: null, dot: false };
38
+ fixture.detectChanges();
39
+
40
+ expect(fixture.debugElement.query(By.css('.frg-badge'))).toBeNull();
41
+ });
42
+
43
+ it('renders dot badge when dot is true', () => {
44
+ component.badge = { dot: true };
45
+ fixture.detectChanges();
46
+
47
+ const badgeEl = fixture.debugElement.query(By.css('.frg-badge'));
48
+ expect(badgeEl).toBeTruthy();
49
+ expect(badgeEl.nativeElement.classList).toContain('frg-badge--dot');
50
+ });
51
+
52
+ it('renders icon before value when iconPosition is start', () => {
53
+ component.badge = { value: 5, icon: 'fas fa-star', iconPosition: 'start' };
54
+ fixture.detectChanges();
55
+
56
+ const badgeEl = fixture.debugElement.query(By.css('.frg-badge'));
57
+ const firstChild = badgeEl.nativeElement.firstElementChild;
58
+ expect(firstChild?.tagName.toLowerCase()).toBe('i');
59
+ });
60
+ });