@weni/unnnic-system 3.9.0 → 3.9.1-alpha.1

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 (279) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/assets/tokens/colors.json.d.ts +376 -0
  3. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  4. package/dist/components/Alert/Alert.vue.d.ts +17 -116
  5. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  6. package/dist/components/Alert/Version1dot1.vue.d.ts +2 -38
  7. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  8. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  9. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  10. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  11. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
  12. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  13. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  14. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  15. package/dist/components/Button/Button.vue.d.ts +1 -1
  16. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  17. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts +1 -1
  19. package/dist/components/Button/types.d.ts.map +1 -1
  20. package/dist/components/Card/AccountCard.vue.d.ts +5 -5
  21. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  22. package/dist/components/Card/Card.vue.d.ts +27 -27
  23. package/dist/components/Card/CardCompany.vue.d.ts +11 -414
  24. package/dist/components/Card/CardData.vue.d.ts +1 -1
  25. package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
  26. package/dist/components/Card/ContentCard.vue.d.ts +3 -3
  27. package/dist/components/Card/DashCard.vue.d.ts +5 -5
  28. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  29. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  30. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  31. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  32. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  33. package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
  34. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  35. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  36. package/dist/components/Carousel/Carousel.vue.d.ts +13 -416
  37. package/dist/components/Carousel/TagCarousel.vue.d.ts +12 -415
  38. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  39. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  40. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  41. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +21 -446
  42. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  44. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  45. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  46. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  47. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  48. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
  50. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  51. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
  52. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
  53. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  54. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  55. package/dist/components/DataTable/index.vue.d.ts +1 -1
  56. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  57. package/dist/components/DateFilter/DateFilter.vue.d.ts +251 -41
  58. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  59. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  60. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  61. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  62. package/dist/components/Flag.vue.d.ts +2 -2
  63. package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
  64. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  65. package/dist/components/Icon.vue.d.ts +1 -1
  66. package/dist/components/Icon.vue.d.ts.map +1 -1
  67. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  68. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  69. package/dist/components/Input/BaseInput.vue.d.ts +33 -2
  70. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  71. package/dist/components/Input/Input.vue.d.ts +251 -41
  72. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  73. package/dist/components/Input/TextInput.vue.d.ts +85 -25
  74. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  75. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +257 -47
  76. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  77. package/dist/components/Label/Label.vue.d.ts +9 -15
  78. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  79. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  80. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +208 -34
  81. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  82. package/dist/components/ModalNext/ModalNext.vue.d.ts +256 -46
  83. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +9 -9
  84. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  85. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +26 -14
  86. package/dist/components/PageHeader/PageHeader.vue.d.ts +28 -0
  87. package/dist/components/PageHeader/PageHeader.vue.d.ts.map +1 -0
  88. package/dist/components/PageHeader/index.d.ts +3 -0
  89. package/dist/components/PageHeader/index.d.ts.map +1 -0
  90. package/dist/components/PageHeader/types.d.ts +9 -0
  91. package/dist/components/PageHeader/types.d.ts.map +1 -0
  92. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  93. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  94. package/dist/components/Radio/Radio.vue.d.ts +10 -6
  95. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  96. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +120 -470
  97. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +11 -414
  98. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  99. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  100. package/dist/components/SelectTime/index.vue.d.ts +85 -25
  101. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  102. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  103. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  104. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  105. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  106. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  107. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  108. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  109. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  110. package/dist/components/Tag/DefaultTag.vue.d.ts +4 -83
  111. package/dist/components/Tag/DefaultTag.vue.d.ts.map +1 -1
  112. package/dist/components/Tag/Tag.vue.d.ts +12 -414
  113. package/dist/components/Tag/Tag.vue.d.ts.map +1 -1
  114. package/dist/components/Tag/types.d.ts +18 -0
  115. package/dist/components/Tag/types.d.ts.map +1 -0
  116. package/dist/components/TextArea/TextArea.vue.d.ts +75 -30
  117. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  118. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  119. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  120. package/dist/components/Toast/ToastManager.d.ts +14 -0
  121. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  122. package/dist/components/Toast/types.d.ts +35 -0
  123. package/dist/components/Toast/types.d.ts.map +1 -0
  124. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  125. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  126. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  127. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  128. package/dist/components/index.d.ts +13122 -13741
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  131. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  132. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  133. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  134. package/dist/components/ui/dialog/DialogContent.vue.d.ts +43 -0
  135. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  136. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  137. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  138. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  139. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  140. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  141. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  142. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  143. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  144. package/dist/components/ui/dialog/index.d.ts +8 -0
  145. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  146. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  147. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  148. package/dist/{es-4b7090cd.mjs → es-de156c12.mjs} +1 -1
  149. package/dist/{index-65c23d9a.mjs → index-21cbba5d.mjs} +12430 -11198
  150. package/dist/locales/en.json.d.ts +2 -1
  151. package/dist/locales/es.json.d.ts +2 -1
  152. package/dist/locales/pt_br.json.d.ts +2 -1
  153. package/dist/{pt-br-6324858c.mjs → pt-br-5fa49a3e.mjs} +1 -1
  154. package/dist/style.css +1 -1
  155. package/dist/unnnic.mjs +200 -179
  156. package/dist/unnnic.umd.js +42 -39
  157. package/dist/utils/call.d.ts +2 -1
  158. package/dist/utils/call.d.ts.map +1 -1
  159. package/package.json +2 -2
  160. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  161. package/src/assets/icons/checkbox-checked.svg +3 -0
  162. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  163. package/src/assets/icons/checkbox-less.svg +3 -0
  164. package/src/assets/icons/radio-checked.svg +3 -0
  165. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  166. package/src/assets/icons/switch-checked.svg +3 -0
  167. package/src/assets/scss/tailwind.scss +8 -0
  168. package/src/components/Alert/Alert.vue +26 -135
  169. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
  170. package/src/components/Alert/Version1dot1.vue +0 -36
  171. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  172. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  173. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  174. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  175. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  176. package/src/components/Button/Button.vue +68 -117
  177. package/src/components/Button/types.ts +0 -1
  178. package/src/components/ChatsContact/ChatsContact.vue +10 -6
  179. package/src/components/Checkbox/Checkbox.vue +117 -65
  180. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  181. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  182. package/src/components/FormElement/FormElement.vue +63 -93
  183. package/src/components/Icon.vue +2 -0
  184. package/src/components/Input/BaseInput.vue +33 -14
  185. package/src/components/Input/Input.scss +20 -21
  186. package/src/components/Input/Input.vue +79 -56
  187. package/src/components/Input/TextInput.vue +80 -68
  188. package/src/components/Input/__test__/Input.spec.js +13 -33
  189. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  190. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  191. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  192. package/src/components/Label/Label.vue +52 -21
  193. package/src/components/Label/__tests__/Label.spec.js +1 -1
  194. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  195. package/src/components/ModalDialog/ModalDialog.vue +62 -148
  196. package/src/components/ModalDialog/__tests__/ModalDialog.spec.js +11 -221
  197. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  198. package/src/components/PageHeader/PageHeader.vue +154 -0
  199. package/src/components/PageHeader/index.ts +2 -0
  200. package/src/components/PageHeader/types.ts +10 -0
  201. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  202. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  203. package/src/components/Popover/index.vue +146 -0
  204. package/src/components/Radio/Radio.vue +118 -66
  205. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  206. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  207. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  208. package/src/components/Select/SelectOption.vue +65 -0
  209. package/src/components/Select/__tests__/Select.spec.js +412 -0
  210. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  211. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  212. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  213. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  214. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  215. package/src/components/Select/index.vue +245 -0
  216. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  217. package/src/components/Switch/Switch.vue +132 -91
  218. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  219. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  220. package/src/components/Tab/Tab.vue +37 -23
  221. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  222. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  223. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  224. package/src/components/Tag/DefaultTag.vue +51 -107
  225. package/src/components/Tag/Tag.vue +32 -79
  226. package/src/components/Tag/types.ts +19 -0
  227. package/src/components/TextArea/TextArea.vue +40 -11
  228. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  229. package/src/components/Toast/Toast.vue +246 -0
  230. package/src/components/Toast/ToastManager.ts +110 -0
  231. package/src/components/Toast/__tests__/Toast.spec.js +291 -0
  232. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  233. package/src/components/Toast/types.ts +57 -0
  234. package/src/components/index.ts +69 -26
  235. package/src/components/ui/dialog/Dialog.vue +15 -0
  236. package/src/components/ui/dialog/DialogClose.vue +25 -0
  237. package/src/components/ui/dialog/DialogContent.vue +133 -0
  238. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  239. package/src/components/ui/dialog/DialogHeader.vue +79 -0
  240. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  241. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  242. package/src/components/ui/dialog/index.ts +7 -0
  243. package/src/locales/en.json +2 -1
  244. package/src/locales/es.json +2 -1
  245. package/src/locales/pt_br.json +2 -1
  246. package/src/stories/Alert.stories.js +6 -67
  247. package/src/stories/Button.stories.js +29 -39
  248. package/src/stories/Checkbox.stories.js +11 -4
  249. package/src/stories/CheckboxGroup.stories.js +105 -0
  250. package/src/stories/Dialog.stories.js +832 -0
  251. package/src/stories/Input.stories.js +71 -76
  252. package/src/stories/Label.stories.js +7 -0
  253. package/src/stories/ModalDialog.mdx +3 -0
  254. package/src/stories/ModalDialog.stories.js +1 -1
  255. package/src/stories/PageHeader.stories.js +330 -0
  256. package/src/stories/Radio.stories.js +28 -1
  257. package/src/stories/RadioGroup.stories.js +144 -0
  258. package/src/stories/Select.stories.js +158 -0
  259. package/src/stories/Switch.stories.js +10 -5
  260. package/src/stories/Tab.stories.js +11 -4
  261. package/src/stories/Tag.stories.js +24 -43
  262. package/src/stories/TextArea.stories.js +14 -2
  263. package/src/stories/Toast.mdx +123 -0
  264. package/src/stories/Toast.stories.js +126 -0
  265. package/src/types/scheme-colors.d.ts +1 -0
  266. package/src/utils/call.js +46 -18
  267. package/dist/components/Tag/BrandTag.vue.d.ts +0 -51
  268. package/dist/components/Tag/BrandTag.vue.d.ts.map +0 -1
  269. package/dist/components/Tag/IndicatorTag.vue.d.ts +0 -151
  270. package/dist/components/Tag/IndicatorTag.vue.d.ts.map +0 -1
  271. package/dist/components/Tag/TagNext.vue.d.ts +0 -24
  272. package/dist/components/Tag/TagNext.vue.d.ts.map +0 -1
  273. package/src/components/Alert/AlertBanner.vue +0 -182
  274. package/src/components/Alert/AlertCaller.vue +0 -49
  275. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  276. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
  277. package/src/components/Tag/BrandTag.vue +0 -96
  278. package/src/components/Tag/IndicatorTag.vue +0 -107
  279. package/src/components/Tag/TagNext.vue +0 -60
@@ -0,0 +1,294 @@
1
+ import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
2
+
3
+ vi.mock('vue', () => ({
4
+ createApp: vi.fn(() => ({
5
+ mount: vi.fn(),
6
+ unmount: vi.fn(),
7
+ })),
8
+ }));
9
+
10
+ vi.mock('../Toast.vue', () => ({
11
+ default: {
12
+ name: 'Toast',
13
+ template: '<div data-testid="toast">Mock Toast</div>',
14
+ },
15
+ }));
16
+
17
+ import toastManager, { toast } from '../ToastManager';
18
+ import Toast from '../Toast.vue';
19
+
20
+ describe('ToastManager', () => {
21
+ let mockCreateApp;
22
+ let mockMount;
23
+ let mockUnmount;
24
+
25
+ beforeEach(async () => {
26
+ vi.clearAllMocks();
27
+
28
+ document.body.innerHTML = '';
29
+
30
+ const { createApp } = await import('vue');
31
+ mockCreateApp = createApp;
32
+ mockMount = vi.fn();
33
+ mockUnmount = vi.fn();
34
+
35
+ mockCreateApp.mockReturnValue({
36
+ mount: mockMount,
37
+ unmount: mockUnmount,
38
+ });
39
+
40
+ Object.defineProperty(globalThis, 'document', {
41
+ value: {
42
+ ...document,
43
+ createElement: vi.fn((tagName) => {
44
+ const element = {
45
+ tagName: tagName.toUpperCase(),
46
+ setAttribute: vi.fn(),
47
+ appendChild: vi.fn(),
48
+ remove: vi.fn(),
49
+ children: [],
50
+ parentNode: null,
51
+ };
52
+
53
+ if (tagName === 'div') {
54
+ element.appendChild = vi.fn((child) => {
55
+ child.parentNode = element;
56
+ element.children.push(child);
57
+ });
58
+ }
59
+
60
+ return element;
61
+ }),
62
+ body: {
63
+ ...document.body,
64
+ appendChild: vi.fn(),
65
+ },
66
+ },
67
+ writable: true,
68
+ });
69
+ });
70
+
71
+ afterEach(() => {
72
+ if (toastManager.toasts) {
73
+ toastManager.toasts.clear();
74
+ }
75
+
76
+ document.body.innerHTML = '';
77
+
78
+ vi.clearAllMocks();
79
+ });
80
+
81
+ describe('Container Management', () => {
82
+ test('creates container on first toast', () => {
83
+ const createElementSpy = vi.spyOn(document, 'createElement');
84
+ const appendChildSpy = vi.spyOn(document.body, 'appendChild');
85
+
86
+ toastManager.show({ title: 'Test Toast' });
87
+
88
+ expect(createElementSpy).toHaveBeenCalledWith('div');
89
+ expect(appendChildSpy).toHaveBeenCalled();
90
+ });
91
+
92
+ test('reuses existing container', () => {
93
+ const createElementSpy = vi.spyOn(document, 'createElement');
94
+
95
+ toastManager.show({ title: 'First Toast' });
96
+ const firstCallCount = createElementSpy.mock.calls.length;
97
+
98
+ toastManager.show({ title: 'Second Toast' });
99
+ const secondCallCount = createElementSpy.mock.calls.length;
100
+
101
+ // First toast: container div + wrapper div = 2 calls
102
+ // Second toast: only wrapper div = 1 more call
103
+ // Total: 3 calls (1 container + 2 wrappers)
104
+ expect(secondCallCount).toBe(firstCallCount + 1);
105
+
106
+ expect(createElementSpy).toHaveBeenCalledWith('div');
107
+ });
108
+ });
109
+
110
+ describe('Toast Instance Management', () => {
111
+ test('generates unique IDs for toasts', () => {
112
+ const toast1 = toastManager.show({ title: 'First Toast' });
113
+ const toast2 = toastManager.show({ title: 'Second Toast' });
114
+
115
+ expect(toast1.id).not.toBe(toast2.id);
116
+ expect(toast1.id).toMatch(/^toast-\d+$/);
117
+ expect(toast2.id).toMatch(/^toast-\d+$/);
118
+ });
119
+
120
+ test('stores toast instances in map', () => {
121
+ const toast1 = toastManager.show({ title: 'First Toast' });
122
+ const toast2 = toastManager.show({ title: 'Second Toast' });
123
+
124
+ expect(toastManager.toasts.has(toast1.id)).toBe(true);
125
+ expect(toastManager.toasts.has(toast2.id)).toBe(true);
126
+ expect(toastManager.toasts.size).toBe(2);
127
+ });
128
+
129
+ test('creates toast with correct props', () => {
130
+ const props = {
131
+ title: 'Test Toast',
132
+ description: 'Test Description',
133
+ type: 'success',
134
+ timeout: 3000,
135
+ };
136
+
137
+ toastManager.show(props);
138
+
139
+ expect(mockCreateApp).toHaveBeenCalledWith(
140
+ Toast,
141
+ expect.objectContaining({
142
+ title: 'Test Toast',
143
+ description: 'Test Description',
144
+ type: 'success',
145
+ timeout: 3000,
146
+ onClose: expect.any(Function),
147
+ onDestroy: expect.any(Function),
148
+ }),
149
+ );
150
+ });
151
+
152
+ test('mounts toast app to wrapper element', () => {
153
+ toastManager.show({ title: 'Test Toast' });
154
+
155
+ expect(mockMount).toHaveBeenCalled();
156
+ });
157
+ });
158
+
159
+ describe('Toast Close Functionality', () => {
160
+ test('removes toast from map when closed', () => {
161
+ const toastInstance = toastManager.show({ title: 'Test Toast' });
162
+
163
+ expect(toastManager.toasts.has(toastInstance.id)).toBe(true);
164
+
165
+ toastManager.close(toastInstance.id);
166
+
167
+ expect(toastManager.toasts.has(toastInstance.id)).toBe(false);
168
+ });
169
+
170
+ test('handles closing non-existent toast gracefully', () => {
171
+ expect(() => {
172
+ toastManager.close('non-existent-id');
173
+ }).not.toThrow();
174
+ });
175
+
176
+ test('calls close when onClose is triggered', () => {
177
+ const closeSpy = vi.spyOn(toastManager, 'close');
178
+
179
+ toastManager.show({ title: 'Test Toast' });
180
+
181
+ const createAppCall = mockCreateApp.mock.calls[0];
182
+ const props = createAppCall[1];
183
+ const onCloseCallback = props.onClose;
184
+
185
+ onCloseCallback();
186
+
187
+ expect(closeSpy).toHaveBeenCalled();
188
+ });
189
+ });
190
+
191
+ describe('Toast Destroy Functionality', () => {
192
+ test('unmounts app and removes wrapper on destroy', () => {
193
+ toastManager.show({ title: 'Test Toast' });
194
+
195
+ const createAppCall = mockCreateApp.mock.calls[0];
196
+ const props = createAppCall[1];
197
+ const onDestroyCallback = props.onDestroy;
198
+
199
+ onDestroyCallback();
200
+
201
+ expect(mockUnmount).toHaveBeenCalled();
202
+ });
203
+
204
+ test('resolves promise when toast is destroyed', async () => {
205
+ const toastInstance = toastManager.show({ title: 'Test Toast' });
206
+
207
+ const createAppCall = mockCreateApp.mock.calls[0];
208
+ const props = createAppCall[1];
209
+ const onDestroyCallback = props.onDestroy;
210
+
211
+ const promiseResolved = vi.fn();
212
+ toastInstance.promise.then(promiseResolved);
213
+
214
+ onDestroyCallback();
215
+
216
+ await new Promise((resolve) => setTimeout(resolve, 0));
217
+
218
+ expect(promiseResolved).toHaveBeenCalled();
219
+ });
220
+ });
221
+
222
+ describe('Toast API', () => {
223
+ beforeEach(() => {
224
+ vi.spyOn(toastManager, 'show').mockReturnValue({
225
+ id: 'mock-id',
226
+ props: {},
227
+ close: vi.fn(),
228
+ promise: Promise.resolve(),
229
+ });
230
+ });
231
+
232
+ test('toast.info creates informational toast', () => {
233
+ toast.info('Info Title', 'Info Description', { timeout: 1000 });
234
+
235
+ expect(toastManager.show).toHaveBeenCalledWith({
236
+ title: 'Info Title',
237
+ description: 'Info Description',
238
+ timeout: 1000,
239
+ type: 'informational',
240
+ });
241
+ });
242
+
243
+ test('toast.success creates success toast', () => {
244
+ toast.success('Success Title', 'Success Description');
245
+
246
+ expect(toastManager.show).toHaveBeenCalledWith({
247
+ title: 'Success Title',
248
+ description: 'Success Description',
249
+ type: 'success',
250
+ });
251
+ });
252
+
253
+ test('toast.attention creates attention toast', () => {
254
+ toast.attention('Attention Title');
255
+
256
+ expect(toastManager.show).toHaveBeenCalledWith({
257
+ title: 'Attention Title',
258
+ type: 'attention',
259
+ });
260
+ });
261
+
262
+ test('toast.error creates error toast', () => {
263
+ toast.error('Error Title', 'Error Description', {
264
+ button: { text: 'Retry', action: vi.fn() },
265
+ });
266
+
267
+ expect(toastManager.show).toHaveBeenCalledWith({
268
+ title: 'Error Title',
269
+ description: 'Error Description',
270
+ button: { text: 'Retry', action: expect.any(Function) },
271
+ type: 'error',
272
+ });
273
+ });
274
+
275
+ test('toast methods return promises', async () => {
276
+ const infoPromise = toast.info('Test');
277
+ const successPromise = toast.success('Test');
278
+ const attentionPromise = toast.attention('Test');
279
+ const errorPromise = toast.error('Test');
280
+
281
+ expect(infoPromise).toBeInstanceOf(Promise);
282
+ expect(successPromise).toBeInstanceOf(Promise);
283
+ expect(attentionPromise).toBeInstanceOf(Promise);
284
+ expect(errorPromise).toBeInstanceOf(Promise);
285
+
286
+ await Promise.all([
287
+ infoPromise,
288
+ successPromise,
289
+ attentionPromise,
290
+ errorPromise,
291
+ ]);
292
+ });
293
+ });
294
+ });
@@ -0,0 +1,57 @@
1
+ export interface ToastManager {
2
+ show: (props: ToastProps) => ToastInstance;
3
+ close: (id: string) => void;
4
+ }
5
+
6
+ export interface ToastButton {
7
+ text: string;
8
+ action: () => void;
9
+ }
10
+
11
+ export type ToastType = 'informational' | 'attention' | 'success' | 'error';
12
+
13
+ export interface ToastProps extends ToastOptions {
14
+ title: string;
15
+ description?: string;
16
+ }
17
+
18
+ export interface ToastOptions {
19
+ type?: ToastType;
20
+ button?: ToastButton;
21
+ timeout?: number;
22
+ }
23
+
24
+ export interface ToastEmits {
25
+ close: [];
26
+ destroy: [];
27
+ }
28
+
29
+ export interface ToastInstance {
30
+ id: string;
31
+ props: ToastProps;
32
+ close: () => void;
33
+ promise: Promise<void>;
34
+ }
35
+
36
+ export interface ToastCall {
37
+ info: (
38
+ title: string,
39
+ description?: string,
40
+ options?: ToastOptions,
41
+ ) => Promise<void>;
42
+ success: (
43
+ title: string,
44
+ description?: string,
45
+ options?: ToastOptions,
46
+ ) => Promise<void>;
47
+ attention: (
48
+ title: string,
49
+ description?: string,
50
+ options?: ToastOptions,
51
+ ) => Promise<void>;
52
+ error: (
53
+ title: string,
54
+ description?: string,
55
+ options?: ToastOptions,
56
+ ) => Promise<void>;
57
+ }
@@ -25,6 +25,7 @@ import cardImage from './CardImage/CardImage.vue';
25
25
  import cardProject from './CardProject/CardProject.vue';
26
26
  import cardInformation from './CardInformation/CardInformation.vue';
27
27
  import checkbox from './Checkbox/Checkbox.vue';
28
+ import checkboxGroup from './CheckboxGroup/CheckboxGroup.vue';
28
29
  import collapse from './Collapse/Collapse.vue';
29
30
  import radio from './Radio/Radio.vue';
30
31
  import languageSelect from './Dropdown/LanguageSelect.vue';
@@ -88,18 +89,28 @@ import ModalDialog from './ModalDialog/ModalDialog.vue';
88
89
  import Tour from './Tour/Tour.vue';
89
90
  import Navigator from './Navigator/index.vue';
90
91
  import SelectTime from './SelectTime/index.vue';
92
+ import TemplatePreview from './TemplatePreview/TemplatePreview.vue';
93
+ import TemplatePreviewModal from './TemplatePreview/TemplatePreviewModal.vue';
91
94
  import DataTable from './DataTable/index.vue';
92
95
  import Chip from './Chip/Chip.vue';
93
- import Tabs from './ui/tabs/Tabs.vue';
94
- import TabsList from './ui/tabs/TabsList.vue';
95
- import TabsTrigger from './ui/tabs/TabsTrigger.vue';
96
- import TabsContent from './ui/tabs/TabsContent.vue';
96
+ import Toast from './Toast/Toast.vue';
97
+ import { toast } from './Toast/ToastManager';
97
98
  import Popover from './ui/popover/Popover.vue';
98
99
  import PopoverContent from './ui/popover/PopoverContent.vue';
99
100
  import PopoverTrigger from './ui/popover/PopoverTrigger.vue';
100
101
  import PopoverFooter from './ui/popover/PopoverFooter.vue';
101
- import TemplatePreview from './TemplatePreview/TemplatePreview.vue';
102
- import TemplatePreviewModal from './TemplatePreview/TemplatePreviewModal.vue';
102
+ import Dialog from './ui/dialog/Dialog.vue';
103
+ import DialogContent from './ui/dialog/DialogContent.vue';
104
+ import DialogFooter from './ui/dialog/DialogFooter.vue';
105
+ import DialogHeader from './ui/dialog/DialogHeader.vue';
106
+ import DialogTitle from './ui/dialog/DialogTitle.vue';
107
+ import DialogTrigger from './ui/dialog/DialogTrigger.vue';
108
+ import DialogClose from './ui/dialog/DialogClose.vue';
109
+ import Tabs from './ui/tabs/Tabs.vue';
110
+ import TabsList from './ui/tabs/TabsList.vue';
111
+ import TabsTrigger from './ui/tabs/TabsTrigger.vue';
112
+ import TabsContent from './ui/tabs/TabsContent.vue';
113
+ import PageHeader from './PageHeader/PageHeader.vue';
103
114
 
104
115
  type VueComponent = Component;
105
116
 
@@ -134,6 +145,7 @@ export const components: ComponentsMap = {
134
145
  unnnicCardProject: cardProject,
135
146
  unnnicCardInformation: cardInformation,
136
147
  unnnicCheckbox: checkbox,
148
+ unnnicCheckboxGroup: checkboxGroup,
137
149
  unnnicCollapse: collapse,
138
150
  unnnicRadio: radio,
139
151
  unnnicLanguageSelect: languageSelect,
@@ -202,13 +214,23 @@ export const components: ComponentsMap = {
202
214
  unnnicTemplatePreviewModal: TemplatePreviewModal,
203
215
  unnnicDataTable: DataTable,
204
216
  unnnicChip: Chip,
217
+ unnnicToast: Toast,
218
+ unnnicToastManager: toast,
219
+ unnnicPopover: Popover,
220
+ unnnicPopoverContent: PopoverContent,
221
+ unnnicPopoverTrigger: PopoverTrigger,
222
+ unnnicDialog: Dialog,
223
+ unnnicDialogContent: DialogContent,
224
+ unnnicDialogFooter: DialogFooter,
225
+ unnnicDialogHeader: DialogHeader,
226
+ unnnicDialogTitle: DialogTitle,
227
+ unnnicDialogTrigger: DialogTrigger,
228
+ unnnicDialogClose: DialogClose,
205
229
  unnnicTabs: Tabs,
206
230
  unnnicTabsList: TabsList,
207
231
  unnnicTabsTrigger: TabsTrigger,
208
232
  unnnicTabsContent: TabsContent,
209
- unnnicPopover: Popover,
210
- unnnicPopoverContent: PopoverContent,
211
- unnnicPopoverTrigger: PopoverTrigger,
233
+ unnnicPageHeader: PageHeader,
212
234
  };
213
235
 
214
236
  export const unnnicFontSize = fontSize;
@@ -238,6 +260,7 @@ export const unnnicCardImage = cardImage as VueComponent;
238
260
  export const unnnicCardProject = cardProject as VueComponent;
239
261
  export const unnnicCardInformation = cardInformation;
240
262
  export const unnnicCheckbox = checkbox;
263
+ export const unnnicCheckboxGroup = checkboxGroup;
241
264
  export const unnnicCollapse = collapse;
242
265
  export const unnnicRadio = radio;
243
266
  export const unnniclanguageSelect = languageSelect as VueComponent;
@@ -260,7 +283,7 @@ export const unnnicAccordion = accordion;
260
283
  export const unnnicIndicator = indicator;
261
284
  export const unnnicSkeletonLoading = skeletonLoading;
262
285
  export const unnnicCarousel = carousel;
263
- export const unnnicLabel = label;
286
+ export const unnnicLabel = label as VueComponent;
264
287
  export const unnnicTab = tab;
265
288
  export const unnnicTabsExpanded = tabsExpanded;
266
289
  export const unnnicBanner = banner;
@@ -301,22 +324,31 @@ export const unnnicDrawer = Drawer;
301
324
  export const unnnicTableNext = TableNext;
302
325
  export const unnnicTour = Tour;
303
326
  export const unnnicNavigator = Navigator;
304
- export const unnnicDataTable = DataTable as VueComponent;
305
327
  export const unnnicSelectTime = SelectTime as VueComponent;
328
+ export const unnnicTemplatePreview = TemplatePreview as VueComponent;
329
+ export const unnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
330
+ export const unnnicDataTable = DataTable as VueComponent;
306
331
  export const unnnicChip = Chip;
307
- export const unnnicTabs = Tabs;
308
- export const unnnicTabsList = TabsList;
309
- export const unnnicTabsTrigger = TabsTrigger;
310
- export const unnnicTabsContent = TabsContent;
332
+ export const unnnicToast = Toast;
333
+ export const unnnicToastManager = toast;
311
334
  export const unnnicPopover = Popover;
312
335
  export const unnnicPopoverContent = PopoverContent;
313
336
  export const unnnicPopoverTrigger = PopoverTrigger;
314
337
  export const unnnicPopoverFooter = PopoverFooter;
315
- export const unnnicTemplatePreview = TemplatePreview as VueComponent;
316
- export const unnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
338
+ export const unnnicDialog = Dialog;
339
+ export const unnnicDialogContent = DialogContent;
340
+ export const unnnicDialogFooter = DialogFooter;
341
+ export const unnnicDialogHeader = DialogHeader;
342
+ export const unnnicDialogTitle = DialogTitle;
343
+ export const unnnicDialogTrigger = DialogTrigger;
344
+ export const unnnicDialogClose = DialogClose;
345
+ export const unnnicTabs = Tabs;
346
+ export const unnnicTabsList = TabsList;
347
+ export const unnnicTabsTrigger = TabsTrigger;
348
+ export const unnnicTabsContent = TabsContent;
349
+ export const unnnicPageHeader = PageHeader;
317
350
 
318
351
  export const UnnnicFontSize = fontSize;
319
- export const UnnnicFormElement = formElement;
320
352
  export const UnnnicInput = input;
321
353
  export const UnnnicInputNext = inputNext;
322
354
  export const UnnnicInputDatePicker = inputDatePicker;
@@ -342,6 +374,7 @@ export const UnnnicCardImage = cardImage as VueComponent;
342
374
  export const UnnnicCardProject = cardProject as VueComponent;
343
375
  export const UnnnicCardInformation = cardInformation;
344
376
  export const UnnnicCheckbox = checkbox;
377
+ export const UnnnicCheckboxGroup = checkboxGroup;
345
378
  export const UnnnicCollapse = collapse;
346
379
  export const UnnnicRadio = radio;
347
380
  export const UnnniclanguageSelect = languageSelect as VueComponent;
@@ -364,7 +397,7 @@ export const UnnnicAccordion = accordion;
364
397
  export const UnnnicIndicator = indicator;
365
398
  export const UnnnicSkeletonLoading = skeletonLoading;
366
399
  export const UnnnicCarousel = carousel;
367
- export const UnnnicLabel = label;
400
+ export const UnnnicLabel = label as VueComponent;
368
401
  export const UnnnicTab = tab;
369
402
  export const UnnnicTabsExpanded = tabsExpanded;
370
403
  export const UnnnicBanner = banner;
@@ -405,16 +438,26 @@ export const UnnnicDrawer = Drawer;
405
438
  export const UnnnicTableNext = TableNext;
406
439
  export const UnnnicTour = Tour;
407
440
  export const UnnnicNavigator = Navigator;
408
- export const UnnnicDataTable = DataTable as VueComponent;
409
441
  export const UnnnicSelectTime = SelectTime as VueComponent;
442
+ export const UnnnicTemplatePreview = TemplatePreview as VueComponent;
443
+ export const UnnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
444
+ export const UnnnicDataTable = DataTable as VueComponent;
410
445
  export const UnnnicChip = Chip;
411
- export const UnnnicTabs = Tabs;
412
- export const UnnnicTabsList = TabsList;
413
- export const UnnnicTabsTrigger = TabsTrigger;
414
- export const UnnnicTabsContent = TabsContent;
446
+ export const UnnnicToast = Toast;
447
+ export const UnnnicToastManager = toast;
415
448
  export const UnnnicPopover = Popover;
416
449
  export const UnnnicPopoverContent = PopoverContent;
417
450
  export const UnnnicPopoverTrigger = PopoverTrigger;
418
451
  export const UnnnicPopoverFooter = PopoverFooter;
419
- export const UnnnicTemplatePreview = TemplatePreview as VueComponent;
420
- export const UnnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
452
+ export const UnnnicDialog = Dialog;
453
+ export const UnnnicDialogContent = DialogContent;
454
+ export const UnnnicDialogFooter = DialogFooter;
455
+ export const UnnnicDialogHeader = DialogHeader;
456
+ export const UnnnicDialogTitle = DialogTitle;
457
+ export const UnnnicDialogTrigger = DialogTrigger;
458
+ export const UnnnicDialogClose = DialogClose;
459
+ export const UnnnicTabs = Tabs;
460
+ export const UnnnicTabsList = TabsList;
461
+ export const UnnnicTabsTrigger = TabsTrigger;
462
+ export const UnnnicTabsContent = TabsContent;
463
+ export const UnnnicPageHeader = PageHeader;
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import type { DialogRootEmits, DialogRootProps } from 'reka-ui';
3
+ import { DialogRoot, useForwardPropsEmits } from 'reka-ui';
4
+
5
+ const props = defineProps<DialogRootProps>();
6
+ const emits = defineEmits<DialogRootEmits>();
7
+
8
+ const forwarded = useForwardPropsEmits(props, emits);
9
+ </script>
10
+
11
+ <template>
12
+ <DialogRoot v-bind="forwarded">
13
+ <slot />
14
+ </DialogRoot>
15
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import type { DialogCloseProps } from 'reka-ui';
3
+ import { DialogClose } from 'reka-ui';
4
+
5
+ const props = defineProps<DialogCloseProps>();
6
+ </script>
7
+
8
+ <template>
9
+ <DialogClose
10
+ class="unnnic-dialog-close"
11
+ v-bind="props"
12
+ >
13
+ <slot />
14
+ </DialogClose>
15
+ </template>
16
+
17
+ <style lang="scss" scoped>
18
+ @use '@/assets/scss/unnnic' as *;
19
+
20
+ .unnnic-dialog-close {
21
+ > * {
22
+ width: 100%;
23
+ }
24
+ }
25
+ </style>