@weni/unnnic-system 3.8.1 → 3.8.2-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 (251) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +17 -116
  4. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  5. package/dist/components/Alert/Version1dot1.vue.d.ts +2 -38
  6. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  7. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  8. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  9. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  10. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
  11. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  12. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  13. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  14. package/dist/components/Button/Button.vue.d.ts +1 -1
  15. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  16. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  17. package/dist/components/Button/types.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts.map +1 -1
  19. package/dist/components/Card/AccountCard.vue.d.ts +5 -5
  20. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  21. package/dist/components/Card/Card.vue.d.ts +27 -27
  22. package/dist/components/Card/CardCompany.vue.d.ts +5 -5
  23. package/dist/components/Card/CardData.vue.d.ts +1 -1
  24. package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
  25. package/dist/components/Card/ContentCard.vue.d.ts +3 -3
  26. package/dist/components/Card/DashCard.vue.d.ts +5 -5
  27. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  28. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  29. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  30. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  31. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  32. package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
  33. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  34. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  35. package/dist/components/Carousel/Carousel.vue.d.ts +7 -7
  36. package/dist/components/Carousel/TagCarousel.vue.d.ts +6 -6
  37. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  38. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  39. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  40. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +27 -34
  41. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  42. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  44. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  45. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  46. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  47. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  48. package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  50. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
  51. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
  52. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  53. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  54. package/dist/components/DataTable/index.vue.d.ts +1 -1
  55. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  56. package/dist/components/DateFilter/DateFilter.vue.d.ts +251 -41
  57. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  58. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  59. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  60. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  61. package/dist/components/Flag.vue.d.ts +2 -2
  62. package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
  63. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  64. package/dist/components/Icon.vue.d.ts +1 -1
  65. package/dist/components/Icon.vue.d.ts.map +1 -1
  66. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  67. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  68. package/dist/components/Input/BaseInput.vue.d.ts +33 -2
  69. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  70. package/dist/components/Input/Input.vue.d.ts +251 -41
  71. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  72. package/dist/components/Input/TextInput.vue.d.ts +85 -25
  73. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  74. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +257 -47
  75. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  76. package/dist/components/Label/Label.vue.d.ts +9 -15
  77. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  78. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  79. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +199 -34
  80. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  81. package/dist/components/ModalNext/ModalNext.vue.d.ts +256 -46
  82. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +8 -8
  83. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  84. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +20 -14
  85. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  86. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  87. package/dist/components/Radio/Radio.vue.d.ts +8 -6
  88. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  89. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +113 -60
  90. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +5 -5
  91. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  92. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  93. package/dist/components/SelectTime/index.vue.d.ts +85 -25
  94. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  95. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  96. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  97. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  98. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  99. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  100. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  101. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  102. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  103. package/dist/components/Tag/BrandTag.vue.d.ts +1 -1
  104. package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
  105. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  106. package/dist/components/Tag/Tag.vue.d.ts +5 -5
  107. package/dist/components/TextArea/TextArea.vue.d.ts +66 -30
  108. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  109. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  110. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  111. package/dist/components/Toast/ToastManager.d.ts +14 -0
  112. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  113. package/dist/components/Toast/types.d.ts +35 -0
  114. package/dist/components/Toast/types.d.ts.map +1 -0
  115. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  116. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  117. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  118. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  119. package/dist/components/index.d.ts +3810 -1331
  120. package/dist/components/index.d.ts.map +1 -1
  121. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  122. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  123. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  124. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  125. package/dist/components/ui/dialog/DialogContent.vue.d.ts +40 -0
  126. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  127. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  128. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  129. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  130. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  131. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  132. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  133. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  134. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  135. package/dist/components/ui/dialog/index.d.ts +8 -0
  136. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  137. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  138. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  139. package/dist/{es-85030529.mjs → es-dc440fef.mjs} +1 -1
  140. package/dist/{index-43dacc8a.mjs → index-6b5eeee8.mjs} +11498 -10514
  141. package/dist/locales/en.json.d.ts +2 -1
  142. package/dist/locales/es.json.d.ts +2 -1
  143. package/dist/locales/pt_br.json.d.ts +2 -1
  144. package/dist/{pt-br-191d9782.mjs → pt-br-a2cfd62d.mjs} +1 -1
  145. package/dist/style.css +1 -1
  146. package/dist/unnnic.mjs +193 -176
  147. package/dist/unnnic.umd.js +43 -39
  148. package/dist/utils/call.d.ts +2 -1
  149. package/dist/utils/call.d.ts.map +1 -1
  150. package/package.json +2 -2
  151. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  152. package/src/assets/icons/checkbox-checked.svg +3 -0
  153. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  154. package/src/assets/icons/checkbox-less.svg +3 -0
  155. package/src/assets/icons/radio-checked.svg +3 -0
  156. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  157. package/src/assets/icons/switch-checked.svg +3 -0
  158. package/src/assets/scss/tailwind.scss +8 -0
  159. package/src/components/Alert/Alert.vue +26 -135
  160. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
  161. package/src/components/Alert/Version1dot1.vue +0 -36
  162. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  163. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  164. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
  165. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  166. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +3 -3
  167. package/src/components/AvatarIcon/__tests__/__snapshots__/AvatarIcon.spec.js.snap +1 -1
  168. package/src/components/Button/Button.vue +68 -117
  169. package/src/components/Button/types.ts +0 -1
  170. package/src/components/Checkbox/Checkbox.vue +117 -65
  171. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  172. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  173. package/src/components/Collapse/__tests__/__snapshots__/Collapse.spec.js.snap +3 -1
  174. package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +3 -3
  175. package/src/components/FormElement/FormElement.vue +63 -93
  176. package/src/components/Icon.vue +2 -0
  177. package/src/components/Input/BaseInput.vue +33 -14
  178. package/src/components/Input/Input.scss +20 -21
  179. package/src/components/Input/Input.vue +79 -56
  180. package/src/components/Input/TextInput.vue +80 -68
  181. package/src/components/Input/__test__/Input.spec.js +13 -33
  182. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  183. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +1 -1
  184. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  185. package/src/components/Label/Label.vue +52 -21
  186. package/src/components/Label/__tests__/Label.spec.js +1 -1
  187. package/src/components/ModalDialog/ModalDialog.vue +60 -146
  188. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  189. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  190. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  191. package/src/components/Popover/index.vue +146 -0
  192. package/src/components/Radio/Radio.vue +98 -67
  193. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  194. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +1 -1
  195. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  196. package/src/components/Select/SelectOption.vue +65 -0
  197. package/src/components/Select/__tests__/Select.spec.js +412 -0
  198. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  199. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  200. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  201. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  202. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  203. package/src/components/Select/index.vue +245 -0
  204. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  205. package/src/components/Switch/Switch.vue +132 -91
  206. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  207. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +1 -1
  208. package/src/components/Tab/Tab.vue +37 -23
  209. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  210. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  211. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  212. package/src/components/TextArea/TextArea.vue +34 -11
  213. package/src/components/Toast/Toast.vue +246 -0
  214. package/src/components/Toast/ToastManager.ts +110 -0
  215. package/src/components/Toast/__tests__/Toast.spec.js +284 -0
  216. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  217. package/src/components/Toast/types.ts +57 -0
  218. package/src/components/index.ts +48 -11
  219. package/src/components/ui/dialog/Dialog.vue +15 -0
  220. package/src/components/ui/dialog/DialogClose.vue +25 -0
  221. package/src/components/ui/dialog/DialogContent.vue +114 -0
  222. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  223. package/src/components/ui/dialog/DialogHeader.vue +78 -0
  224. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  225. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  226. package/src/components/ui/dialog/index.ts +7 -0
  227. package/src/locales/en.json +2 -1
  228. package/src/locales/es.json +2 -1
  229. package/src/locales/pt_br.json +2 -1
  230. package/src/stories/Alert.stories.js +6 -67
  231. package/src/stories/Button.stories.js +29 -39
  232. package/src/stories/Checkbox.stories.js +11 -4
  233. package/src/stories/CheckboxGroup.stories.js +105 -0
  234. package/src/stories/Dialog.stories.js +832 -0
  235. package/src/stories/Input.stories.js +71 -76
  236. package/src/stories/Label.stories.js +7 -0
  237. package/src/stories/ModalDialog.mdx +3 -0
  238. package/src/stories/ModalDialog.stories.js +1 -1
  239. package/src/stories/RadioGroup.stories.js +144 -0
  240. package/src/stories/Select.stories.js +158 -0
  241. package/src/stories/Switch.stories.js +10 -5
  242. package/src/stories/Tab.stories.js +11 -4
  243. package/src/stories/TextArea.stories.js +13 -2
  244. package/src/stories/Toast.mdx +123 -0
  245. package/src/stories/Toast.stories.js +126 -0
  246. package/src/types/scheme-colors.d.ts +1 -0
  247. package/src/utils/call.js +46 -18
  248. package/src/components/Alert/AlertBanner.vue +0 -182
  249. package/src/components/Alert/AlertCaller.vue +0 -49
  250. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  251. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
@@ -0,0 +1,123 @@
1
+ import { Meta, Source, Story } from '@storybook/blocks';
2
+
3
+ import * as ToastStories from './Toast.stories';
4
+
5
+ <Meta of={ToastStories} />
6
+
7
+ # Toast
8
+
9
+ The Toast component is used to display temporary notifications in the user interface. It appears in the bottom right corner of the screen with smooth animation and can be closed automatically or manually.
10
+
11
+ <Source
12
+ language="html"
13
+ dark
14
+ code={`
15
+ <UnnnicToast
16
+ title="Success!"
17
+ description="Your action was completed successfully."
18
+ type="success"
19
+ :timeout="5000"
20
+ @close="onClose"
21
+ @destroy="onDestroy"
22
+ />
23
+ `}
24
+ />
25
+
26
+ ---
27
+
28
+ #### **Props Options:**
29
+
30
+ | Key | Description | Values | Default |
31
+ |-------------|------------------------------------------|-------------------------------------------------------------|-----------------|
32
+ | title | **Required.** Toast title | `string` | - |
33
+ | description | Toast descriptive text | `string` | `''` |
34
+ | type | Visual type of the toast | `'informational'` \| `'attention'` \| `'success'` \| `'error'` | `'informational'` |
35
+ | timeout | Time in ms for auto-dismiss (0 = persistent) | `number` | `5000` |
36
+ | button | Optional action button configuration | `{ text: string; action: () => void }` | `undefined` |
37
+
38
+ #### **Events:**
39
+
40
+ | Event | Description |
41
+ |---------|------------------------------------------------|
42
+ | close | Emitted when the toast is closed |
43
+ | destroy | Emitted when the toast is removed from DOM |
44
+
45
+ ---
46
+
47
+ ## Features
48
+
49
+ - **Animations**: Smooth entry and exit transitions
50
+ - **Visual types**: Different variations for different types of messages
51
+ - **Action button**: Optional, for quick actions
52
+ - **Auto-dismiss**: Configurable or persistent
53
+
54
+ ## Usage
55
+
56
+ ### As component
57
+
58
+ <Source
59
+ language="vue"
60
+ dark
61
+ code={`
62
+ <template>
63
+ <UnnnicToast
64
+ title="Success!"
65
+ description="Your action was completed successfully."
66
+ type="success"
67
+ :timeout="5000"
68
+ @close="onToastClose"
69
+ />
70
+ </template>
71
+
72
+ <script setup>
73
+ import { UnnnicToast } from '@weni/unnnic-system';
74
+
75
+ const onToastClose = () => {
76
+ console.log('Toast closed');
77
+ };
78
+ </script>
79
+ `}
80
+ />
81
+
82
+ ### Programmatically
83
+
84
+ The Toast component can be used programmatically through the `toast` utility, which provides a simple API for creating toasts without needing to manage component state.
85
+
86
+ <Source
87
+ language="javascript"
88
+ dark
89
+ code={`
90
+ // Basic usage
91
+ import { toast } from '@weni/unnnic-system';
92
+
93
+ toast.info('Information', 'Here is some useful information');
94
+ `}
95
+ />
96
+
97
+ #### API Reference
98
+
99
+ | Method | Parameters | Description |
100
+ |--------|------------|-------------|
101
+ | `toast.success(title, description?, options?)` | `title: string`<br/>`description?: string`<br/>`options?: ToastOptions` | Creates a success toast |
102
+ | `toast.error(title, description?, options?)` | `title: string`<br/>`description?: string`<br/>`options?: ToastOptions` | Creates an error toast |
103
+ | `toast.attention(title, description?, options?)` | `title: string`<br/>`description?: string`<br/>`options?: ToastOptions` | Creates an attention/warning toast |
104
+ | `toast.info(title, description?, options?)` | `title: string`<br/>`description?: string`<br/>`options?: ToastOptions` | Creates an informational toast |
105
+
106
+ #### ToastOptions Interface
107
+
108
+ ```typescript
109
+ interface ToastOptions {
110
+ timeout?: number; // Auto-dismiss time in ms (0 = persistent)
111
+ button?: { // Optional action button
112
+ text: string;
113
+ action: () => void;
114
+ };
115
+ onClose?: () => void; // Callback when toast is closed
116
+ }
117
+ ```
118
+
119
+ ## Animations
120
+
121
+ - **Entry**: Slide from bottom to top with fade-in
122
+ - **Exit**: Slide from top to bottom with fade-out
123
+ - **Duration**: 300ms with smooth easing
@@ -0,0 +1,126 @@
1
+ import Toast from '../components/Toast/Toast.vue';
2
+ import { action } from '@storybook/addon-actions';
3
+
4
+ export default {
5
+ title: 'Feedback/Toast',
6
+ component: Toast,
7
+ argTypes: {
8
+ title: {
9
+ control: 'text',
10
+ },
11
+ description: {
12
+ control: 'text',
13
+ },
14
+ type: {
15
+ control: 'select',
16
+ options: ['informational', 'attention', 'success', 'error'],
17
+ },
18
+ timeout: {
19
+ control: 'number',
20
+ },
21
+ button: {
22
+ control: 'object',
23
+ },
24
+ },
25
+ render: (args) => ({
26
+ components: { Toast },
27
+ setup() {
28
+ return { args };
29
+ },
30
+ methods: {
31
+ onClose() {
32
+ action('@close')('');
33
+ },
34
+ onDestroy() {
35
+ action('@destroy')('');
36
+ },
37
+ },
38
+ template: `
39
+ <div style="position: relative; height: 50px;">
40
+ <Toast
41
+ v-bind="args"
42
+ @close="onClose"
43
+ @destroy="onDestroy"
44
+ />
45
+ </div>
46
+ `,
47
+ }),
48
+ };
49
+
50
+ export const Informational = {
51
+ args: {
52
+ title: 'Information',
53
+ description: 'This is an informative message for the user.',
54
+ type: 'informational',
55
+ timeout: 5000,
56
+ },
57
+ };
58
+
59
+ export const Attention = {
60
+ args: {
61
+ title: 'Attention',
62
+ description: 'Please verify the data before continuing.',
63
+ type: 'attention',
64
+ timeout: 5000,
65
+ },
66
+ };
67
+
68
+ export const Success = {
69
+ args: {
70
+ title: 'Success!',
71
+ description: 'Your action was completed successfully.',
72
+ type: 'success',
73
+ timeout: 5000,
74
+ },
75
+ };
76
+
77
+ export const Error = {
78
+ args: {
79
+ title: 'Error',
80
+ description: 'An error occurred while processing your request.',
81
+ type: 'error',
82
+ timeout: 5000,
83
+ },
84
+ };
85
+
86
+ export const WithActionButton = {
87
+ args: {
88
+ title: 'New version available',
89
+ description: 'A new version of the system is available for download.',
90
+ type: 'informational',
91
+ timeout: 0,
92
+ button: {
93
+ text: 'Update',
94
+ action: () => {
95
+ alert('Updating...');
96
+ },
97
+ },
98
+ },
99
+ };
100
+
101
+ export const Persistent = {
102
+ args: {
103
+ title: 'Important message',
104
+ description: 'This message will remain visible until manually closed.',
105
+ type: 'attention',
106
+ timeout: 0,
107
+ },
108
+ };
109
+
110
+ export const TitleOnly = {
111
+ args: {
112
+ title: 'Simple message',
113
+ type: 'success',
114
+ timeout: 5000,
115
+ },
116
+ };
117
+
118
+ export const LongText = {
119
+ args: {
120
+ title: 'Document processed',
121
+ description:
122
+ 'The document "Annual_Report_2024_Final_Definitive_Complete_Version.pdf" was processed successfully and is available for download in your workspace.',
123
+ type: 'success',
124
+ timeout: 8000,
125
+ },
126
+ };
@@ -140,6 +140,7 @@ export type SchemeColor =
140
140
  | 'feedback-yellow'
141
141
  | 'feedback-blue'
142
142
  | 'feedback-grey'
143
+ | 'fg-base'
143
144
  | 'aux-blue'
144
145
  | 'aux-purple'
145
146
  | 'aux-orange'
package/src/utils/call.js CHANGED
@@ -1,30 +1,58 @@
1
1
  import { createApp } from 'vue';
2
2
  import Alert from '../components/Alert/Alert.vue';
3
3
  import Modal from '../components/Modal/Modal.vue';
4
+ import ToastInstance from '../components/Toast/ToastManager';
4
5
  import mitt from 'mitt';
5
6
 
6
7
  const emitter = mitt();
7
-
8
- const callAlert = ({ props, containerRef }) => {
9
- const AlertComponent = createApp(Alert, {
10
- ...props,
11
- onClose: () => {
12
- instance.$el.remove();
13
- },
14
- created() {
15
- emitter.on(['close'], () => {
8
+ const callAlert = ({ props, containerRef, seconds }) => {
9
+ if (props.version === '1.1' || containerRef) {
10
+ const AlertComponent = createApp(Alert, {
11
+ ...props,
12
+ seconds,
13
+ version: '1.1',
14
+ onClose: () => {
16
15
  instance.$el.remove();
17
- });
18
- },
19
- });
20
- const element = document.createElement('div');
21
- const instance = AlertComponent.mount(element);
16
+ },
17
+ created() {
18
+ emitter.on(['close'], () => {
19
+ instance.$el.remove();
20
+ });
21
+ },
22
+ });
23
+ const element = document.createElement('div');
24
+ const instance = AlertComponent.mount(element);
22
25
 
23
- if (containerRef) {
24
- instance.$el.style.position = 'absolute';
25
- containerRef.appendChild(instance.$el);
26
+ if (containerRef) {
27
+ instance.$el.style.position = 'absolute';
28
+ containerRef.appendChild(instance.$el);
29
+ } else {
30
+ document.body.appendChild(instance.$el);
31
+ }
26
32
  } else {
27
- document.body.appendChild(instance.$el);
33
+ const typeMap = {
34
+ success: 'success',
35
+ error: 'error',
36
+ attention: 'attention',
37
+ default: 'informational',
38
+ 'feedback-green': 'success',
39
+ 'feedback-red': 'error',
40
+ };
41
+
42
+ const toastProps = {
43
+ timeout: seconds ? seconds * 1000 : 5000,
44
+ type: typeMap[props.scheme || props.type] || typeMap.default,
45
+
46
+ onClose: () => {
47
+ emitter.emit(['close']);
48
+ },
49
+ };
50
+
51
+ ToastInstance.show({
52
+ title: props.text,
53
+ description: '',
54
+ ...toastProps,
55
+ });
28
56
  }
29
57
  };
30
58
 
@@ -1,182 +0,0 @@
1
- <template>
2
- <section
3
- :class="[
4
- 'banner-alert',
5
- {
6
- 'banner-alert--banner-danger': type === 'danger',
7
- 'banner-alert--banner-warning': type === 'warning',
8
- },
9
- ]"
10
- >
11
- <header
12
- v-show="text"
13
- class="banner-alert__container-text"
14
- >
15
- <UnnnicIcon
16
- v-show="isShowTextIcon(type)"
17
- class="banner-alert__textIcon"
18
- :icon="getIconType(type)"
19
- size="sm"
20
- scheme="neutral-white"
21
- data-test="unnnic-icon"
22
- />
23
- <p class="text">{{ text }}</p>
24
- <a
25
- v-if="linkHref"
26
- class="banner-alert__link"
27
- :href="linkHref"
28
- :target="linkTarget"
29
- >
30
- {{ linkText }}
31
- </a>
32
- </header>
33
-
34
- <div
35
- v-show="showCloseButton"
36
- class="banner-alert__close"
37
- @click="emitClose"
38
- >
39
- <UnnnicIcon
40
- icon="close"
41
- size="sm"
42
- scheme="neutral-white"
43
- data-test="unnnic-close-icon"
44
- />
45
- </div>
46
- </section>
47
- </template>
48
-
49
- <script>
50
- import UnnnicIcon from '../Icon.vue';
51
-
52
- export default {
53
- components: {
54
- UnnnicIcon,
55
- },
56
- props: {
57
- text: {
58
- type: String,
59
- default: null,
60
- },
61
- onClose: {
62
- type: Function,
63
- default: () => {},
64
- },
65
- showCloseButton: {
66
- type: Boolean,
67
- default: false,
68
- },
69
- linkHref: {
70
- type: String,
71
- default: '',
72
- },
73
- linkTarget: {
74
- type: String,
75
- default: '_blank',
76
- },
77
- linkText: {
78
- type: String,
79
- default: 'Learn more',
80
- },
81
- type: {
82
- type: String,
83
- default: 'info',
84
- },
85
- },
86
- methods: {
87
- getIconType(type) {
88
- if (type === 'danger') return 'block';
89
- if (!type.trim()) return 'info'; // check if type is empty or whitespace
90
- return type;
91
- },
92
- isShowTextIcon(type) {
93
- return ['danger', 'warning', 'info', ''].includes(type);
94
- },
95
- emitClose() {
96
- this.onClose();
97
-
98
- this.$emit('close');
99
- },
100
- },
101
- };
102
- </script>
103
-
104
- <style lang="scss" scoped>
105
- @use '@/assets/scss/unnnic' as *;
106
-
107
- .banner-alert {
108
- display: grid;
109
- grid-template-columns: 1fr auto;
110
- text-align: center;
111
- margin-bottom: $unnnic-spacing-sm;
112
-
113
- color: $unnnic-color-neutral-white;
114
- font-family: $unnnic-font-family-secondary;
115
- font-size: $unnnic-font-size-body-gt;
116
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-md;
117
- font-weight: $unnnic-font-weight-regular;
118
- background-color: $unnnic-color-aux-blue-500;
119
-
120
- &__container-text {
121
- display: flex;
122
- justify-content: center;
123
- align-items: center;
124
- padding: $unnnic-spacing-xs $unnnic-spacing-sm;
125
- flex-grow: 1;
126
-
127
- .text {
128
- margin: 0 $unnnic-spacing-nano 0 0;
129
- }
130
- }
131
-
132
- &__textIcon {
133
- margin-right: $unnnic-spacing-xs;
134
- }
135
-
136
- &__link {
137
- color: inherit;
138
- display: block;
139
- font-weight: $unnnic-font-weight-bold;
140
- text-decoration: underline;
141
- text-underline-position: under;
142
- }
143
-
144
- &__close {
145
- display: flex;
146
- align-items: center;
147
- max-height: 38px;
148
- padding: 0 $unnnic-spacing-sm;
149
- cursor: pointer;
150
- user-select: none;
151
- border-left: $unnnic-border-width-thinner solid $unnnic-color-aux-blue-300;
152
- &:hover {
153
- background-color: $unnnic-color-aux-blue-300;
154
- }
155
- }
156
-
157
- &--banner-warning {
158
- background-color: $unnnic-color-aux-orange-500;
159
-
160
- .banner-alert__close {
161
- border-left: $unnnic-border-width-thinner solid
162
- $unnnic-color-aux-orange-300;
163
-
164
- &:hover {
165
- background-color: $unnnic-color-aux-orange-300;
166
- }
167
- }
168
- }
169
-
170
- &--banner-danger {
171
- background-color: $unnnic-color-aux-red-500;
172
-
173
- .banner-alert__close {
174
- border-left: $unnnic-border-width-thinner solid $unnnic-color-aux-red-300;
175
-
176
- &:hover {
177
- background-color: $unnnic-color-aux-red-300;
178
- }
179
- }
180
- }
181
- }
182
- </style>
@@ -1,49 +0,0 @@
1
- <template>
2
- <button @click="callAlert">Launch alert</button>
3
- </template>
4
-
5
- <script>
6
- import alert from '../../utils/call';
7
-
8
- export default {
9
- props: {
10
- title: {
11
- type: String,
12
- default: null,
13
- },
14
- text: {
15
- type: String,
16
- default: null,
17
- },
18
- icon: {
19
- type: String,
20
- default: null,
21
- },
22
- enabled: {
23
- type: Boolean,
24
- default: true,
25
- },
26
- scheme: {
27
- type: String,
28
- default: null,
29
- },
30
- seconds: {
31
- type: Number,
32
- default: 3,
33
- },
34
- closeText: {
35
- type: String,
36
- default: null,
37
- },
38
- position: {
39
- type: String,
40
- default: 'top-right',
41
- },
42
- },
43
- methods: {
44
- callAlert() {
45
- alert.callAlert({ props: this.$props, seconds: this.seconds });
46
- },
47
- },
48
- };
49
- </script>
@@ -1,89 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import { describe, test, expect, beforeEach, afterEach, vi } from 'vitest';
3
- import AlertBanner from '@/components/Alert/AlertBanner.vue';
4
-
5
- describe('AlertBanner.vue', () => {
6
- let wrapper;
7
-
8
- beforeEach(() => {
9
- wrapper = mount(AlertBanner, {
10
- props: {
11
- text: 'This is a banner alert',
12
- type: 'danger',
13
- showCloseButton: true,
14
- linkHref: 'https://example.com',
15
- linkText: 'Learn more',
16
- linkTarget: '_self',
17
- onClose: vi.fn(),
18
- },
19
- });
20
- });
21
-
22
- afterEach(() => {
23
- wrapper.unmount();
24
- });
25
-
26
- test('renders correctly', () => {
27
- expect(wrapper.exists()).toBe(true);
28
- });
29
-
30
- test('renders the correct text and link', () => {
31
- const textElement = wrapper.find('.text');
32
- const linkElement = wrapper.find('.banner-alert__link');
33
-
34
- expect(textElement.text()).toBe('This is a banner alert');
35
- expect(linkElement.text()).toBe('Learn more');
36
- expect(linkElement.attributes('href')).toBe('https://example.com');
37
- expect(linkElement.attributes('target')).toBe('_self');
38
- });
39
-
40
- test('applies the correct class based on the type', () => {
41
- expect(wrapper.classes()).toContain('banner-alert--banner-danger');
42
- });
43
-
44
- test('renders the correct icon based on the type', () => {
45
- const icon = wrapper.findComponent('[data-test="unnnic-icon"]');
46
- expect(icon.exists()).toBe(true);
47
- expect(icon.props('icon')).toBe('block');
48
- expect(icon.props('size')).toBe('sm');
49
- expect(icon.props('scheme')).toBe('neutral-white');
50
- });
51
-
52
- test('does not render the icon when type is not danger, warning, or info', async () => {
53
- await wrapper.setProps({ type: 'success' });
54
- const icon = wrapper.findComponent('[data-test="unnnic-icon"]');
55
- expect(icon.element.style.display).toBe('none');
56
- });
57
-
58
- test('calls emitClose and emits close event when close button is clicked', async () => {
59
- const closeButton = wrapper.find('.banner-alert__close');
60
- await closeButton.trigger('click');
61
-
62
- expect(wrapper.emitted()).toHaveProperty('close');
63
- expect(wrapper.props().onClose).toHaveBeenCalled();
64
- });
65
-
66
- test('does not render close button if showCloseButton is false', async () => {
67
- await wrapper.setProps({ showCloseButton: false });
68
- const closeButton = wrapper.find('.banner-alert__close');
69
- expect(closeButton.element.style.display).toBe('none');
70
- });
71
-
72
- test('matches the snapshot', () => {
73
- expect(wrapper.html()).toMatchSnapshot();
74
- });
75
-
76
- test('getIconType function returns the correct icon based on type', () => {
77
- expect(wrapper.vm.getIconType('danger')).toBe('block');
78
- expect(wrapper.vm.getIconType('info')).toBe('info');
79
- expect(wrapper.vm.getIconType('')).toBe('info');
80
- });
81
-
82
- test('isShowTextIcon function returns true for danger, warning, and info types', () => {
83
- expect(wrapper.vm.isShowTextIcon('danger')).toBe(true);
84
- expect(wrapper.vm.isShowTextIcon('warning')).toBe(true);
85
- expect(wrapper.vm.isShowTextIcon('info')).toBe(true);
86
- expect(wrapper.vm.isShowTextIcon('')).toBe(true);
87
- expect(wrapper.vm.isShowTextIcon('success')).toBe(false);
88
- });
89
- });