@tacdaed/fragments 1.0.0-beta.3 → 1.0.0-beta.4

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 +14 -0
  2. package/ng-package.json +20 -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/tacdaed-fragments.mjs +0 -8928
  247. package/fesm2022/tacdaed-fragments.mjs.map +0 -1
  248. package/index.d.ts +0 -3929
@@ -0,0 +1,165 @@
1
+ import { NgClass } from '@angular/common';
2
+ import { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';
3
+ import { ToastCloseEvent, TToastCloseReason, TToastPosition, TToastSize, TToastStyle } from './toast.type';
4
+
5
+ @Component({
6
+ selector: 'frg-toast',
7
+ imports: [NgClass],
8
+ templateUrl: './toast.component.html',
9
+ styleUrl: './toast.component.scss'
10
+ })
11
+ export class ToastComponent implements OnChanges, OnDestroy {
12
+ @Input() open: boolean = false;
13
+ @Input() title: string = '';
14
+ @Input() message: string = '';
15
+ @Input() styleType: TToastStyle = 'primary';
16
+ @Input() position: TToastPosition = 'top-right';
17
+ @Input() size: TToastSize = 'medium';
18
+ @Input() autoClose: boolean = false;
19
+ @Input() duration: number = 4000;
20
+ @Input() hasCloseButton: boolean = true;
21
+ @Input() stacked: boolean = false;
22
+ @Input() closing: boolean = false;
23
+ @Input() motionDuration: number = 200;
24
+ @Input() ariaLabel: string = 'Notification';
25
+
26
+ @Output() closed = new EventEmitter<ToastCloseEvent>();
27
+
28
+ private closeTimerId: ReturnType<typeof setTimeout> | null = null;
29
+ private enterTimerId: ReturnType<typeof setTimeout> | null = null;
30
+ private leaveTimerId: ReturnType<typeof setTimeout> | null = null;
31
+
32
+ protected isRendered = false;
33
+ protected isEntering = false;
34
+ protected isClosing = false;
35
+
36
+ get statusIconClass(): string | null {
37
+ switch (this.styleType) {
38
+ case 'info':
39
+ return 'fas fa-info-circle';
40
+ case 'success':
41
+ return 'fas fa-check-circle';
42
+ case 'warning':
43
+ return 'fas fa-exclamation-triangle';
44
+ case 'danger':
45
+ return 'fas fa-times-circle';
46
+ default:
47
+ return null;
48
+ }
49
+ }
50
+
51
+ get toastClassMap() {
52
+ return {
53
+ 'frg-toast--stacked': this.stacked,
54
+ 'frg-toast--top-left': this.position === 'top-left',
55
+ 'frg-toast--top-right': this.position === 'top-right',
56
+ 'frg-toast--bottom-left': this.position === 'bottom-left',
57
+ 'frg-toast--bottom-right': this.position === 'bottom-right',
58
+ 'frg-toast--size-small': this.size === 'small',
59
+ 'frg-toast--size-medium': this.size === 'medium',
60
+ 'frg-toast--size-large': this.size === 'large',
61
+ 'frg-toast--enter': this.isEntering,
62
+ 'frg-toast--leave': this.isClosing || this.closing,
63
+ 'frg-toast--primary': this.styleType === 'primary',
64
+ 'frg-toast--secondary': this.styleType === 'secondary',
65
+ 'frg-toast--tertiary': this.styleType === 'tertiary',
66
+ 'frg-toast--dark': this.styleType === 'dark',
67
+ 'frg-toast--light': this.styleType === 'light',
68
+ 'frg-toast--info': this.styleType === 'info',
69
+ 'frg-toast--success': this.styleType === 'success',
70
+ 'frg-toast--warning': this.styleType === 'warning',
71
+ 'frg-toast--danger': this.styleType === 'danger',
72
+ 'frg-toast--default': this.styleType === 'default'
73
+ };
74
+ }
75
+
76
+ ngOnChanges(changes: SimpleChanges): void {
77
+ if (changes['open']) {
78
+ if (this.open) {
79
+ this.openToast();
80
+ } else {
81
+ this.closeToast();
82
+ }
83
+ }
84
+ if (changes['open'] || changes['autoClose'] || changes['duration']) {
85
+ this.syncAutoClose();
86
+ }
87
+ }
88
+
89
+ ngOnDestroy(): void {
90
+ this.clearCloseTimer();
91
+ this.clearEnterTimer();
92
+ this.clearLeaveTimer();
93
+ }
94
+
95
+ onCloseClick(): void {
96
+ this.requestClose('close-button');
97
+ }
98
+
99
+ private syncAutoClose(): void {
100
+ this.clearCloseTimer();
101
+
102
+ if (!this.open || !this.autoClose || this.duration <= 0) {
103
+ return;
104
+ }
105
+
106
+ this.closeTimerId = setTimeout(() => {
107
+ this.requestClose('timeout');
108
+ }, this.duration);
109
+ }
110
+
111
+ private requestClose(reason: TToastCloseReason): void {
112
+ if (!this.open) {
113
+ return;
114
+ }
115
+ this.clearCloseTimer();
116
+ this.closed.emit({ reason });
117
+ }
118
+
119
+ private clearCloseTimer(): void {
120
+ if (this.closeTimerId) {
121
+ clearTimeout(this.closeTimerId);
122
+ this.closeTimerId = null;
123
+ }
124
+ }
125
+
126
+ private openToast(): void {
127
+ this.isRendered = true;
128
+ this.isClosing = false;
129
+ this.startEnterAnimation();
130
+ }
131
+
132
+ private closeToast(): void {
133
+ if (!this.isRendered) {
134
+ return;
135
+ }
136
+ this.isClosing = true;
137
+ this.clearLeaveTimer();
138
+ this.leaveTimerId = setTimeout(() => {
139
+ this.isClosing = false;
140
+ this.isRendered = false;
141
+ }, this.motionDuration);
142
+ }
143
+
144
+ private startEnterAnimation(): void {
145
+ this.clearEnterTimer();
146
+ this.isEntering = true;
147
+ this.enterTimerId = setTimeout(() => {
148
+ this.isEntering = false;
149
+ }, this.motionDuration);
150
+ }
151
+
152
+ private clearEnterTimer(): void {
153
+ if (this.enterTimerId) {
154
+ clearTimeout(this.enterTimerId);
155
+ this.enterTimerId = null;
156
+ }
157
+ }
158
+
159
+ private clearLeaveTimer(): void {
160
+ if (this.leaveTimerId) {
161
+ clearTimeout(this.leaveTimerId);
162
+ this.leaveTimerId = null;
163
+ }
164
+ }
165
+ }
@@ -0,0 +1,37 @@
1
+ import { TBaseSize, TBaseStyle } from '../../types/base.types';
2
+
3
+ export type TToastStyle = 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 TToastPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
16
+ export type TToastCloseReason = 'close-button' | 'timeout' | 'programmatic';
17
+ export type TToastSize = TBaseSize;
18
+
19
+ export interface ToastCloseEvent {
20
+ reason: TToastCloseReason;
21
+ }
22
+
23
+ export interface ToastStackItem {
24
+ id: string;
25
+ title?: string;
26
+ message?: string;
27
+ styleType?: TToastStyle;
28
+ size?: TToastSize;
29
+ autoClose?: boolean;
30
+ duration?: number;
31
+ hasCloseButton?: boolean;
32
+ ariaLabel?: string;
33
+ }
34
+
35
+ export interface ToastStackCloseEvent extends ToastCloseEvent {
36
+ id: string;
37
+ }
@@ -0,0 +1,30 @@
1
+ @if (visibleToasts.length) {
2
+ <div
3
+ class="frg-toast-stack"
4
+ [ngClass]="{
5
+ 'frg-toast-stack--top-left': position === 'top-left',
6
+ 'frg-toast-stack--top-right': position === 'top-right',
7
+ 'frg-toast-stack--bottom-left': position === 'bottom-left',
8
+ 'frg-toast-stack--bottom-right': position === 'bottom-right'
9
+ }"
10
+ >
11
+ @for (toast of visibleToasts; track toast.id) {
12
+ <frg-toast
13
+ [open]="true"
14
+ [title]="toast.title || ''"
15
+ [message]="toast.message || ''"
16
+ [styleType]="toast.styleType || 'primary'"
17
+ [size]="toast.size || 'medium'"
18
+ [autoClose]="toast.autoClose ?? false"
19
+ [duration]="toast.duration ?? 4000"
20
+ [hasCloseButton]="toast.hasCloseButton ?? true"
21
+ [ariaLabel]="toast.ariaLabel || 'Notification'"
22
+ [stacked]="true"
23
+ [closing]="isClosing(toast.id)"
24
+ [position]="position"
25
+ [motionDuration]="motionDuration"
26
+ (closed)="onToastClosed(toast.id, $event)"
27
+ ></frg-toast>
28
+ }
29
+ </div>
30
+ }
@@ -0,0 +1,35 @@
1
+ @use '../../../../assets/styles/scss/variables' as *;
2
+
3
+ :host {
4
+ display: block;
5
+
6
+ .frg-toast-stack {
7
+ position: fixed;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 0.75rem;
11
+ z-index: 1100;
12
+ min-width: 18rem;
13
+ max-width: 24rem;
14
+ }
15
+
16
+ .frg-toast-stack--top-left {
17
+ top: 1.5rem;
18
+ left: 1.5rem;
19
+ }
20
+
21
+ .frg-toast-stack--top-right {
22
+ top: 1.5rem;
23
+ right: 1.5rem;
24
+ }
25
+
26
+ .frg-toast-stack--bottom-left {
27
+ bottom: 1.5rem;
28
+ left: 1.5rem;
29
+ }
30
+
31
+ .frg-toast-stack--bottom-right {
32
+ bottom: 1.5rem;
33
+ right: 1.5rem;
34
+ }
35
+ }
@@ -0,0 +1,51 @@
1
+ import { NgClass } from '@angular/common';
2
+ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
3
+ import { ToastComponent } from '../toast/toast.component';
4
+ import { ToastCloseEvent, ToastStackCloseEvent, ToastStackItem, TToastPosition } from '../toast/toast.type';
5
+
6
+ @Component({
7
+ selector: 'frg-toast-stack',
8
+ imports: [NgClass, ToastComponent],
9
+ templateUrl: './toast-stack.component.html',
10
+ styleUrl: './toast-stack.component.scss'
11
+ })
12
+ export class ToastStackComponent implements OnChanges {
13
+ @Input() toasts: ToastStackItem[] = [];
14
+ @Input() position: TToastPosition = 'top-right';
15
+ @Input() maxVisible: number = 4;
16
+ @Input() motionDuration: number = 200;
17
+
18
+ @Output() closed = new EventEmitter<ToastStackCloseEvent>();
19
+
20
+ private closingIds = new Set<string>();
21
+
22
+ get visibleToasts(): ToastStackItem[] {
23
+ return this.toasts.slice(0, this.maxVisible);
24
+ }
25
+
26
+ ngOnChanges(changes: SimpleChanges): void {
27
+ if (changes['toasts']) {
28
+ const ids = new Set(this.toasts.map((toast) => toast.id));
29
+ this.closingIds.forEach((id) => {
30
+ if (!ids.has(id)) {
31
+ this.closingIds.delete(id);
32
+ }
33
+ });
34
+ }
35
+ }
36
+
37
+ onToastClosed(id: string, event: ToastCloseEvent): void {
38
+ if (this.closingIds.has(id)) {
39
+ return;
40
+ }
41
+ this.closingIds.add(id);
42
+ setTimeout(() => {
43
+ this.closingIds.delete(id);
44
+ this.closed.emit({ id, reason: event.reason });
45
+ }, this.motionDuration);
46
+ }
47
+
48
+ isClosing(id: string): boolean {
49
+ return this.closingIds.has(id);
50
+ }
51
+ }
@@ -0,0 +1,244 @@
1
+ export const TELEPHONE_COUNTRY_PREFIX: { name: string; dial_code: string; code: string }[] = [
2
+ { name: 'Afghanistan', dial_code: '+93', code: 'AF' },
3
+ { name: 'Aland Islands', dial_code: '+358', code: 'AX' },
4
+ { name: 'Albania', dial_code: '+355', code: 'AL' },
5
+ { name: 'Algeria', dial_code: '+213', code: 'DZ' },
6
+ { name: 'AmericanSamoa', dial_code: '+1684', code: 'AS' },
7
+ { name: 'Andorra', dial_code: '+376', code: 'AD' },
8
+ { name: 'Angola', dial_code: '+244', code: 'AO' },
9
+ { name: 'Anguilla', dial_code: '+1264', code: 'AI' },
10
+ { name: 'Antarctica', dial_code: '+672', code: 'AQ' },
11
+ { name: 'Antigua and Barbuda', dial_code: '+1268', code: 'AG' },
12
+ { name: 'Argentina', dial_code: '+54', code: 'AR' },
13
+ { name: 'Armenia', dial_code: '+374', code: 'AM' },
14
+ { name: 'Aruba', dial_code: '+297', code: 'AW' },
15
+ { name: 'Australia', dial_code: '+61', code: 'AU' },
16
+ { name: 'Austria', dial_code: '+43', code: 'AT' },
17
+ { name: 'Azerbaijan', dial_code: '+994', code: 'AZ' },
18
+ { name: 'Bahamas', dial_code: '+1242', code: 'BS' },
19
+ { name: 'Bahrain', dial_code: '+973', code: 'BH' },
20
+ { name: 'Bangladesh', dial_code: '+880', code: 'BD' },
21
+ { name: 'Barbados', dial_code: '+1246', code: 'BB' },
22
+ { name: 'Belarus', dial_code: '+375', code: 'BY' },
23
+ { name: 'Belgium', dial_code: '+32', code: 'BE' },
24
+ { name: 'Belize', dial_code: '+501', code: 'BZ' },
25
+ { name: 'Benin', dial_code: '+229', code: 'BJ' },
26
+ { name: 'Bermuda', dial_code: '+1441', code: 'BM' },
27
+ { name: 'Bhutan', dial_code: '+975', code: 'BT' },
28
+ { name: 'Bolivia, Plurinational State of', dial_code: '+591', code: 'BO' },
29
+ { name: 'Bosnia and Herzegovina', dial_code: '+387', code: 'BA' },
30
+ { name: 'Botswana', dial_code: '+267', code: 'BW' },
31
+ { name: 'Brazil', dial_code: '+55', code: 'BR' },
32
+ { name: 'British Indian Ocean Territory', dial_code: '+246', code: 'IO' },
33
+ { name: 'Brunei Darussalam', dial_code: '+673', code: 'BN' },
34
+ { name: 'Bulgaria', dial_code: '+359', code: 'BG' },
35
+ { name: 'Burkina Faso', dial_code: '+226', code: 'BF' },
36
+ { name: 'Burundi', dial_code: '+257', code: 'BI' },
37
+ { name: 'Cambodia', dial_code: '+855', code: 'KH' },
38
+ { name: 'Cameroon', dial_code: '+237', code: 'CM' },
39
+ { name: 'Canada', dial_code: '+1', code: 'CA' },
40
+ { name: 'Cape Verde', dial_code: '+238', code: 'CV' },
41
+ { name: 'Cayman Islands', dial_code: '+1345', code: 'KY' },
42
+ { name: 'Central African Republic', dial_code: '+236', code: 'CF' },
43
+ { name: 'Chad', dial_code: '+235', code: 'TD' },
44
+ { name: 'Chile', dial_code: '+56', code: 'CL' },
45
+ { name: 'China', dial_code: '+86', code: 'CN' },
46
+ { name: 'Christmas Island', dial_code: '+61', code: 'CX' },
47
+ { name: 'Cocos (Keeling) Islands', dial_code: '+61', code: 'CC' },
48
+ { name: 'Colombia', dial_code: '+57', code: 'CO' },
49
+ { name: 'Comoros', dial_code: '+269', code: 'KM' },
50
+ { name: 'Congo', dial_code: '+242', code: 'CG' },
51
+ { name: 'Congo, The Democratic Republic of the Congo', dial_code: '+243', code: 'CD' },
52
+ { name: 'Cook Islands', dial_code: '+682', code: 'CK' },
53
+ { name: 'Costa Rica', dial_code: '+506', code: 'CR' },
54
+ { name: "Cote d'Ivoire", dial_code: '+225', code: 'CI' },
55
+ { name: 'Croatia', dial_code: '+385', code: 'HR' },
56
+ { name: 'Cuba', dial_code: '+53', code: 'CU' },
57
+ { name: 'Cyprus', dial_code: '+357', code: 'CY' },
58
+ { name: 'Czech Republic', dial_code: '+420', code: 'CZ' },
59
+ { name: 'Denmark', dial_code: '+45', code: 'DK' },
60
+ { name: 'Djibouti', dial_code: '+253', code: 'DJ' },
61
+ { name: 'Dominica', dial_code: '+1767', code: 'DM' },
62
+ { name: 'Dominican Republic', dial_code: '+1849', code: 'DO' },
63
+ { name: 'Ecuador', dial_code: '+593', code: 'EC' },
64
+ { name: 'Egypt', dial_code: '+20', code: 'EG' },
65
+ { name: 'El Salvador', dial_code: '+503', code: 'SV' },
66
+ { name: 'Equatorial Guinea', dial_code: '+240', code: 'GQ' },
67
+ { name: 'Eritrea', dial_code: '+291', code: 'ER' },
68
+ { name: 'Estonia', dial_code: '+372', code: 'EE' },
69
+ { name: 'Ethiopia', dial_code: '+251', code: 'ET' },
70
+ { name: 'Falkland Islands (Malvinas)', dial_code: '+500', code: 'FK' },
71
+ { name: 'Faroe Islands', dial_code: '+298', code: 'FO' },
72
+ { name: 'Fiji', dial_code: '+679', code: 'FJ' },
73
+ { name: 'Finland', dial_code: '+358', code: 'FI' },
74
+ { name: 'France', dial_code: '+33', code: 'FR' },
75
+ { name: 'French Guiana', dial_code: '+594', code: 'GF' },
76
+ { name: 'French Polynesia', dial_code: '+689', code: 'PF' },
77
+ { name: 'Gabon', dial_code: '+241', code: 'GA' },
78
+ { name: 'Gambia', dial_code: '+220', code: 'GM' },
79
+ { name: 'Georgia', dial_code: '+995', code: 'GE' },
80
+ { name: 'Germany', dial_code: '+49', code: 'DE' },
81
+ { name: 'Ghana', dial_code: '+233', code: 'GH' },
82
+ { name: 'Gibraltar', dial_code: '+350', code: 'GI' },
83
+ { name: 'Greece', dial_code: '+30', code: 'GR' },
84
+ { name: 'Greenland', dial_code: '+299', code: 'GL' },
85
+ { name: 'Grenada', dial_code: '+1473', code: 'GD' },
86
+ { name: 'Guadeloupe', dial_code: '+590', code: 'GP' },
87
+ { name: 'Guam', dial_code: '+1671', code: 'GU' },
88
+ { name: 'Guatemala', dial_code: '+502', code: 'GT' },
89
+ { name: 'Guernsey', dial_code: '+44', code: 'GG' },
90
+ { name: 'Guinea', dial_code: '+224', code: 'GN' },
91
+ { name: 'Guinea-Bissau', dial_code: '+245', code: 'GW' },
92
+ { name: 'Guyana', dial_code: '+595', code: 'GY' },
93
+ { name: 'Haiti', dial_code: '+509', code: 'HT' },
94
+ { name: 'Holy See (Vatican City State)', dial_code: '+379', code: 'VA' },
95
+ { name: 'Honduras', dial_code: '+504', code: 'HN' },
96
+ { name: 'Hong Kong', dial_code: '+852', code: 'HK' },
97
+ { name: 'Hungary', dial_code: '+36', code: 'HU' },
98
+ { name: 'Iceland', dial_code: '+354', code: 'IS' },
99
+ { name: 'India', dial_code: '+91', code: 'IN' },
100
+ { name: 'Indonesia', dial_code: '+62', code: 'ID' },
101
+ { name: 'Iran, Islamic Republic of Persian Gulf', dial_code: '+98', code: 'IR' },
102
+ { name: 'Iraq', dial_code: '+964', code: 'IQ' },
103
+ { name: 'Ireland', dial_code: '+353', code: 'IE' },
104
+ { name: 'Isle of Man', dial_code: '+44', code: 'IM' },
105
+ { name: 'Israel', dial_code: '+972', code: 'IL' },
106
+ { name: 'Italy', dial_code: '+39', code: 'IT' },
107
+ { name: 'Jamaica', dial_code: '+1876', code: 'JM' },
108
+ { name: 'Japan', dial_code: '+81', code: 'JP' },
109
+ { name: 'Jersey', dial_code: '+44', code: 'JE' },
110
+ { name: 'Jordan', dial_code: '+962', code: 'JO' },
111
+ { name: 'Kazakhstan', dial_code: '+77', code: 'KZ' },
112
+ { name: 'Kenya', dial_code: '+254', code: 'KE' },
113
+ { name: 'Kiribati', dial_code: '+686', code: 'KI' },
114
+ { name: "Korea, Democratic People's Republic of Korea", dial_code: '+850', code: 'KP' },
115
+ { name: 'Korea, Republic of South Korea', dial_code: '+82', code: 'KR' },
116
+ { name: 'Kuwait', dial_code: '+965', code: 'KW' },
117
+ { name: 'Kyrgyzstan', dial_code: '+996', code: 'KG' },
118
+ { name: 'Laos', dial_code: '+856', code: 'LA' },
119
+ { name: 'Latvia', dial_code: '+371', code: 'LV' },
120
+ { name: 'Lebanon', dial_code: '+961', code: 'LB' },
121
+ { name: 'Lesotho', dial_code: '+266', code: 'LS' },
122
+ { name: 'Liberia', dial_code: '+231', code: 'LR' },
123
+ { name: 'Libyan Arab Jamahiriya', dial_code: '+218', code: 'LY' },
124
+ { name: 'Liechtenstein', dial_code: '+423', code: 'LI' },
125
+ { name: 'Lithuania', dial_code: '+370', code: 'LT' },
126
+ { name: 'Luxembourg', dial_code: '+352', code: 'LU' },
127
+ { name: 'Macao', dial_code: '+853', code: 'MO' },
128
+ { name: 'Macedonia', dial_code: '+389', code: 'MK' },
129
+ { name: 'Madagascar', dial_code: '+261', code: 'MG' },
130
+ { name: 'Malawi', dial_code: '+265', code: 'MW' },
131
+ { name: 'Malaysia', dial_code: '+60', code: 'MY' },
132
+ { name: 'Maldives', dial_code: '+960', code: 'MV' },
133
+ { name: 'Mali', dial_code: '+223', code: 'ML' },
134
+ { name: 'Malta', dial_code: '+356', code: 'MT' },
135
+ { name: 'Marshall Islands', dial_code: '+692', code: 'MH' },
136
+ { name: 'Martinique', dial_code: '+596', code: 'MQ' },
137
+ { name: 'Mauritania', dial_code: '+222', code: 'MR' },
138
+ { name: 'Mauritius', dial_code: '+230', code: 'MU' },
139
+ { name: 'Mayotte', dial_code: '+262', code: 'YT' },
140
+ { name: 'Mexico', dial_code: '+52', code: 'MX' },
141
+ { name: 'Micronesia, Federated States of Micronesia', dial_code: '+691', code: 'FM' },
142
+ { name: 'Moldova', dial_code: '+373', code: 'MD' },
143
+ { name: 'Monaco', dial_code: '+377', code: 'MC' },
144
+ { name: 'Mongolia', dial_code: '+976', code: 'MN' },
145
+ { name: 'Montenegro', dial_code: '+382', code: 'ME' },
146
+ { name: 'Montserrat', dial_code: '+1664', code: 'MS' },
147
+ { name: 'Morocco', dial_code: '+212', code: 'MA' },
148
+ { name: 'Mozambique', dial_code: '+258', code: 'MZ' },
149
+ { name: 'Myanmar', dial_code: '+95', code: 'MM' },
150
+ { name: 'Namibia', dial_code: '+264', code: 'NA' },
151
+ { name: 'Nauru', dial_code: '+674', code: 'NR' },
152
+ { name: 'Nepal', dial_code: '+977', code: 'NP' },
153
+ { name: 'Netherlands', dial_code: '+31', code: 'NL' },
154
+ { name: 'Netherlands Antilles', dial_code: '+599', code: 'AN' },
155
+ { name: 'New Caledonia', dial_code: '+687', code: 'NC' },
156
+ { name: 'New Zealand', dial_code: '+64', code: 'NZ' },
157
+ { name: 'Nicaragua', dial_code: '+505', code: 'NI' },
158
+ { name: 'Niger', dial_code: '+227', code: 'NE' },
159
+ { name: 'Nigeria', dial_code: '+234', code: 'NG' },
160
+ { name: 'Niue', dial_code: '+683', code: 'NU' },
161
+ { name: 'Norfolk Island', dial_code: '+672', code: 'NF' },
162
+ { name: 'Northern Mariana Islands', dial_code: '+1670', code: 'MP' },
163
+ { name: 'Norway', dial_code: '+47', code: 'NO' },
164
+ { name: 'Oman', dial_code: '+968', code: 'OM' },
165
+ { name: 'Pakistan', dial_code: '+92', code: 'PK' },
166
+ { name: 'Palau', dial_code: '+680', code: 'PW' },
167
+ { name: 'Palestinian Territory, Occupied', dial_code: '+970', code: 'PS' },
168
+ { name: 'Panama', dial_code: '+507', code: 'PA' },
169
+ { name: 'Papua New Guinea', dial_code: '+675', code: 'PG' },
170
+ { name: 'Paraguay', dial_code: '+595', code: 'PY' },
171
+ { name: 'Peru', dial_code: '+51', code: 'PE' },
172
+ { name: 'Philippines', dial_code: '+63', code: 'PH' },
173
+ { name: 'Pitcairn', dial_code: '+872', code: 'PN' },
174
+ { name: 'Poland', dial_code: '+48', code: 'PL' },
175
+ { name: 'Portugal', dial_code: '+351', code: 'PT' },
176
+ { name: 'Puerto Rico', dial_code: '+1939', code: 'PR' },
177
+ { name: 'Qatar', dial_code: '+974', code: 'QA' },
178
+ { name: 'Romania', dial_code: '+40', code: 'RO' },
179
+ { name: 'Russia', dial_code: '+7', code: 'RU' },
180
+ { name: 'Rwanda', dial_code: '+250', code: 'RW' },
181
+ { name: 'Reunion', dial_code: '+262', code: 'RE' },
182
+ { name: 'Saint Barthelemy', dial_code: '+590', code: 'BL' },
183
+ { name: 'Saint Helena, Ascension and Tristan Da Cunha', dial_code: '+290', code: 'SH' },
184
+ { name: 'Saint Kitts and Nevis', dial_code: '+1869', code: 'KN' },
185
+ { name: 'Saint Lucia', dial_code: '+1758', code: 'LC' },
186
+ { name: 'Saint Martin', dial_code: '+590', code: 'MF' },
187
+ { name: 'Saint Pierre and Miquelon', dial_code: '+508', code: 'PM' },
188
+ { name: 'Saint Vincent and the Grenadines', dial_code: '+1784', code: 'VC' },
189
+ { name: 'Samoa', dial_code: '+685', code: 'WS' },
190
+ { name: 'San Marino', dial_code: '+378', code: 'SM' },
191
+ { name: 'Sao Tome and Principe', dial_code: '+239', code: 'ST' },
192
+ { name: 'Saudi Arabia', dial_code: '+966', code: 'SA' },
193
+ { name: 'Senegal', dial_code: '+221', code: 'SN' },
194
+ { name: 'Serbia', dial_code: '+381', code: 'RS' },
195
+ { name: 'Seychelles', dial_code: '+248', code: 'SC' },
196
+ { name: 'Sierra Leone', dial_code: '+232', code: 'SL' },
197
+ { name: 'Singapore', dial_code: '+65', code: 'SG' },
198
+ { name: 'Slovakia', dial_code: '+421', code: 'SK' },
199
+ { name: 'Slovenia', dial_code: '+386', code: 'SI' },
200
+ { name: 'Solomon Islands', dial_code: '+677', code: 'SB' },
201
+ { name: 'Somalia', dial_code: '+252', code: 'SO' },
202
+ { name: 'South Africa', dial_code: '+27', code: 'ZA' },
203
+ { name: 'South Sudan', dial_code: '+211', code: 'SS' },
204
+ { name: 'South Georgia and the South Sandwich Islands', dial_code: '+500', code: 'GS' },
205
+ { name: 'Spain', dial_code: '+34', code: 'ES' },
206
+ { name: 'Sri Lanka', dial_code: '+94', code: 'LK' },
207
+ { name: 'Sudan', dial_code: '+249', code: 'SD' },
208
+ { name: 'Suriname', dial_code: '+597', code: 'SR' },
209
+ { name: 'Svalbard and Jan Mayen', dial_code: '+47', code: 'SJ' },
210
+ { name: 'Swaziland', dial_code: '+268', code: 'SZ' },
211
+ { name: 'Sweden', dial_code: '+46', code: 'SE' },
212
+ { name: 'Switzerland', dial_code: '+41', code: 'CH' },
213
+ { name: 'Syrian Arab Republic', dial_code: '+963', code: 'SY' },
214
+ { name: 'Taiwan', dial_code: '+886', code: 'TW' },
215
+ { name: 'Tajikistan', dial_code: '+992', code: 'TJ' },
216
+ { name: 'Tanzania, United Republic of Tanzania', dial_code: '+255', code: 'TZ' },
217
+ { name: 'Thailand', dial_code: '+66', code: 'TH' },
218
+ { name: 'Timor-Leste', dial_code: '+670', code: 'TL' },
219
+ { name: 'Togo', dial_code: '+228', code: 'TG' },
220
+ { name: 'Tokelau', dial_code: '+690', code: 'TK' },
221
+ { name: 'Tonga', dial_code: '+676', code: 'TO' },
222
+ { name: 'Trinidad and Tobago', dial_code: '+1868', code: 'TT' },
223
+ { name: 'Tunisia', dial_code: '+216', code: 'TN' },
224
+ { name: 'Turkey', dial_code: '+90', code: 'TR' },
225
+ { name: 'Turkmenistan', dial_code: '+993', code: 'TM' },
226
+ { name: 'Turks and Caicos Islands', dial_code: '+1649', code: 'TC' },
227
+ { name: 'Tuvalu', dial_code: '+688', code: 'TV' },
228
+ { name: 'Uganda', dial_code: '+256', code: 'UG' },
229
+ { name: 'Ukraine', dial_code: '+380', code: 'UA' },
230
+ { name: 'United Arab Emirates', dial_code: '+971', code: 'AE' },
231
+ { name: 'United Kingdom', dial_code: '+44', code: 'GB' },
232
+ { name: 'United States', dial_code: '+1', code: 'US' },
233
+ { name: 'Uruguay', dial_code: '+598', code: 'UY' },
234
+ { name: 'Uzbekistan', dial_code: '+998', code: 'UZ' },
235
+ { name: 'Vanuatu', dial_code: '+678', code: 'VU' },
236
+ { name: 'Venezuela, Bolivarian Republic of Venezuela', dial_code: '+58', code: 'VE' },
237
+ { name: 'Vietnam', dial_code: '+84', code: 'VN' },
238
+ { name: 'Virgin Islands, British', dial_code: '+1284', code: 'VG' },
239
+ { name: 'Virgin Islands, U.S.', dial_code: '+1340', code: 'VI' },
240
+ { name: 'Wallis and Futuna', dial_code: '+681', code: 'WF' },
241
+ { name: 'Yemen', dial_code: '+967', code: 'YE' },
242
+ { name: 'Zambia', dial_code: '+260', code: 'ZM' },
243
+ { name: 'Zimbabwe', dial_code: '+263', code: 'ZW' }
244
+ ];