@weni/unnnic-system 3.7.1 → 3.8.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +16 -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 +3993 -1340
  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/Popover.vue.d.ts +23 -0
  138. package/dist/components/ui/popover/Popover.vue.d.ts.map +1 -0
  139. package/dist/components/ui/popover/PopoverContent.vue.d.ts +28 -0
  140. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -0
  141. package/dist/components/ui/popover/PopoverFooter.vue.d.ts +18 -0
  142. package/dist/components/ui/popover/PopoverFooter.vue.d.ts.map +1 -0
  143. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +19 -0
  144. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +1 -0
  145. package/dist/components/ui/popover/index.d.ts +6 -0
  146. package/dist/components/ui/popover/index.d.ts.map +1 -0
  147. package/dist/{es-484b4c46.mjs → es-4bdcf86e.mjs} +1 -1
  148. package/dist/{index-dc007393.mjs → index-0d6fa367.mjs} +18908 -11929
  149. package/dist/locales/en.json.d.ts +2 -1
  150. package/dist/locales/es.json.d.ts +2 -1
  151. package/dist/locales/pt_br.json.d.ts +2 -1
  152. package/dist/{pt-br-f73c4b3a.mjs → pt-br-51af7f2a.mjs} +1 -1
  153. package/dist/style.css +1 -1
  154. package/dist/unnnic.mjs +197 -172
  155. package/dist/unnnic.umd.js +56 -50
  156. package/dist/utils/call.d.ts +2 -1
  157. package/dist/utils/call.d.ts.map +1 -1
  158. package/package.json +3 -2
  159. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  160. package/src/assets/icons/checkbox-checked.svg +3 -0
  161. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  162. package/src/assets/icons/checkbox-less.svg +3 -0
  163. package/src/assets/icons/radio-checked.svg +3 -0
  164. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  165. package/src/assets/icons/switch-checked.svg +3 -0
  166. package/src/assets/scss/tailwind.scss +8 -0
  167. package/src/components/Alert/Alert.vue +26 -135
  168. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
  169. package/src/components/Alert/Version1dot1.vue +0 -36
  170. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  171. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  172. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  173. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  174. package/src/components/Button/Button.vue +68 -117
  175. package/src/components/Button/types.ts +0 -1
  176. package/src/components/Checkbox/Checkbox.vue +98 -64
  177. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  178. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  179. package/src/components/FormElement/FormElement.vue +63 -93
  180. package/src/components/Icon.vue +2 -0
  181. package/src/components/Input/BaseInput.vue +33 -14
  182. package/src/components/Input/Input.scss +20 -21
  183. package/src/components/Input/Input.vue +79 -56
  184. package/src/components/Input/TextInput.vue +80 -68
  185. package/src/components/Input/__test__/Input.spec.js +13 -33
  186. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  187. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  188. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  189. package/src/components/Label/Label.vue +52 -21
  190. package/src/components/Label/__tests__/Label.spec.js +1 -1
  191. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  192. package/src/components/ModalDialog/ModalDialog.vue +60 -146
  193. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  194. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  195. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  196. package/src/components/Popover/index.vue +146 -0
  197. package/src/components/Radio/Radio.vue +80 -67
  198. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  199. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  200. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  201. package/src/components/Select/SelectOption.vue +65 -0
  202. package/src/components/Select/__tests__/Select.spec.js +412 -0
  203. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  204. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  205. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  206. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  207. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  208. package/src/components/Select/index.vue +245 -0
  209. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  210. package/src/components/Switch/Switch.vue +123 -96
  211. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  212. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  213. package/src/components/Tab/Tab.vue +37 -23
  214. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  215. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  216. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  217. package/src/components/TextArea/TextArea.vue +34 -11
  218. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  219. package/src/components/Toast/Toast.vue +246 -0
  220. package/src/components/Toast/ToastManager.ts +110 -0
  221. package/src/components/Toast/__tests__/Toast.spec.js +284 -0
  222. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  223. package/src/components/Toast/types.ts +57 -0
  224. package/src/components/index.ts +61 -9
  225. package/src/components/ui/dialog/Dialog.vue +15 -0
  226. package/src/components/ui/dialog/DialogClose.vue +25 -0
  227. package/src/components/ui/dialog/DialogContent.vue +114 -0
  228. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  229. package/src/components/ui/dialog/DialogHeader.vue +78 -0
  230. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  231. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  232. package/src/components/ui/dialog/index.ts +7 -0
  233. package/src/components/ui/popover/Popover.vue +19 -0
  234. package/src/components/ui/popover/PopoverContent.vue +109 -0
  235. package/src/components/ui/popover/PopoverFooter.vue +32 -0
  236. package/src/components/ui/popover/PopoverTrigger.vue +23 -0
  237. package/src/components/ui/popover/index.ts +5 -0
  238. package/src/locales/en.json +2 -1
  239. package/src/locales/es.json +2 -1
  240. package/src/locales/pt_br.json +2 -1
  241. package/src/stories/Alert.stories.js +6 -67
  242. package/src/stories/Button.stories.js +29 -39
  243. package/src/stories/Checkbox.stories.js +11 -4
  244. package/src/stories/CheckboxGroup.stories.js +105 -0
  245. package/src/stories/Dialog.stories.js +832 -0
  246. package/src/stories/Input.stories.js +71 -76
  247. package/src/stories/Label.stories.js +7 -0
  248. package/src/stories/ModalDialog.mdx +3 -0
  249. package/src/stories/ModalDialog.stories.js +1 -1
  250. package/src/stories/Popover.stories.js +396 -0
  251. package/src/stories/RadioGroup.stories.js +144 -0
  252. package/src/stories/Select.stories.js +158 -0
  253. package/src/stories/Switch.stories.js +10 -5
  254. package/src/stories/Tab.stories.js +11 -4
  255. package/src/stories/TextArea.stories.js +13 -2
  256. package/src/stories/Toast.mdx +123 -0
  257. package/src/stories/Toast.stories.js +126 -0
  258. package/src/types/scheme-colors.d.ts +1 -0
  259. package/src/utils/call.js +46 -18
  260. package/src/components/Alert/AlertBanner.vue +0 -182
  261. package/src/components/Alert/AlertCaller.vue +0 -49
  262. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  263. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
@@ -9,6 +9,7 @@
9
9
  class="tab-head"
10
10
  :class="{
11
11
  'tab-head--active': localValue === tab,
12
+ 'tab-head--disabled': disabledTabs?.includes(tab),
12
13
  }"
13
14
  @click="change(tab)"
14
15
  >
@@ -20,10 +21,9 @@
20
21
  side="bottom"
21
22
  >
22
23
  <UnnnicIcon
23
- icon="info"
24
+ icon="help"
24
25
  :size="size === 'sm' ? 'xs' : 'sm'"
25
- filled
26
- scheme="neutral-cleanest"
26
+ scheme="fg-base"
27
27
  />
28
28
  </UnnnicToolTip>
29
29
  </li>
@@ -65,6 +65,13 @@ export default {
65
65
  tabs: {
66
66
  type: Array,
67
67
  default: null,
68
+ validator: (tabs) => {
69
+ return tabs.every((tab) => typeof tab === 'string') && tabs.length <= 5;
70
+ },
71
+ },
72
+ disabledTabs: {
73
+ type: Array,
74
+ default: null,
68
75
  },
69
76
  },
70
77
  emits: ['change'],
@@ -105,6 +112,10 @@ export default {
105
112
  return '';
106
113
  },
107
114
  change(value) {
115
+ if (this.disabledTabs?.includes(value)) {
116
+ return;
117
+ }
118
+
108
119
  this.localValue = value;
109
120
  this.$emit('change', this.localValue);
110
121
  },
@@ -119,18 +130,15 @@ export default {
119
130
  display: flex;
120
131
  align-items: flex-start;
121
132
  justify-content: space-between;
122
- color: $unnnic-color-neutral-cloudy;
123
- font-family: $unnnic-font-family-secondary;
124
- font-weight: $unnnic-font-weight-bold;
125
- font-size: $unnnic-font-size-body-lg;
126
- line-height: ($unnnic-font-size-body-lg + $unnnic-line-height-medium);
127
- margin-bottom: $unnnic-inset-sm;
128
- border-bottom: $unnnic-border-width-thinner solid $unnnic-color-neutral-soft;
133
+ color: $unnnic-color-fg-base;
134
+ font: $unnnic-font-action;
135
+ margin-bottom: $unnnic-space-4;
136
+ border-bottom: $unnnic-border-width-thinner solid $unnnic-color-border-base;
129
137
  }
130
138
 
131
139
  .tab-content {
132
140
  display: flex;
133
- gap: $unnnic-spacing-sm;
141
+ gap: $unnnic-space-6;
134
142
 
135
143
  margin: 0;
136
144
  padding: 0;
@@ -139,27 +147,24 @@ export default {
139
147
 
140
148
  .tab-head {
141
149
  display: flex;
142
- gap: $unnnic-spacing-xs;
150
+ gap: $unnnic-space-2;
143
151
  align-items: center;
144
152
 
145
153
  cursor: pointer;
146
- margin: $unnnic-spacing-xs $unnnic-spacing-sm;
154
+ padding: $unnnic-space-2 $unnnic-space-4;
147
155
 
148
156
  .unnnic-tooltip {
149
157
  display: flex;
150
158
  }
151
159
 
152
160
  &:hover {
153
- color: $unnnic-color-neutral-black;
161
+ color: $unnnic-color-fg-emphasized;
154
162
  }
155
163
  }
156
164
 
157
165
  .tab-head--active {
158
- font-family: $unnnic-font-family-secondary;
159
- font-weight: $unnnic-font-weight-bold;
160
- color: $unnnic-color-neutral-black;
161
- font-size: $unnnic-font-size-body-lg;
162
- line-height: ($unnnic-font-size-body-lg + $unnnic-line-height-medium);
166
+ color: $unnnic-color-fg-emphasized;
167
+ font: $unnnic-font-action;
163
168
  transition: 0.4s;
164
169
 
165
170
  position: relative;
@@ -168,14 +173,23 @@ export default {
168
173
  content: '';
169
174
 
170
175
  position: absolute;
171
- bottom: -$unnnic-spacing-xs;
172
- left: -$unnnic-spacing-sm;
176
+ bottom: 0;
177
+ left: 0;
173
178
 
174
179
  display: block;
175
180
 
176
- width: calc(100% + (#{$unnnic-spacing-sm} * 2));
181
+ width: 100%;
177
182
 
178
- border-bottom: $unnnic-border-width-thin solid $unnnic-color-weni-600;
183
+ border-bottom: $unnnic-border-width-thin solid $unnnic-color-border-active;
184
+ }
185
+ }
186
+
187
+ .tab-head--disabled {
188
+ color: $unnnic-color-fg-muted;
189
+ cursor: default;
190
+
191
+ &:hover {
192
+ color: $unnnic-color-fg-muted;
179
193
  }
180
194
  }
181
195
 
@@ -4,7 +4,7 @@ exports[`Tab.vue > matches the snapshot 1`] = `
4
4
  "<div data-v-b4e39fac="" class="tab size-md">
5
5
  <header data-v-b4e39fac="" class="tab-header">
6
6
  <ul data-v-b4e39fac="" class="tab-content">
7
- <li data-v-b4e39fac="" class="tab-head">tab1<div data-v-bf0cf546="" data-v-b4e39fac="" class="unnnic-tooltip"><span data-v-26446d8e="" data-v-b4e39fac="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-cleanest unnnic-icon-size--sm unnnic-icon__size--sm material-symbols-rounded--filled" data-testid="material-icon" translate="no">info</span><span data-v-bf0cf546="" class="unnnic-tooltip-label unnnic-tooltip-label-bottom" data-testid="tooltip-label" style="left: 0px; top: 8px;">Tooltip text <br data-v-bf0cf546=""><!--v-if--></span></div>
7
+ <li data-v-b4e39fac="" class="tab-head">tab1<div data-v-bf0cf546="" data-v-b4e39fac="" class="unnnic-tooltip"><span data-v-26446d8e="" data-v-b4e39fac="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="material-icon" translate="no">help</span><span data-v-bf0cf546="" class="unnnic-tooltip-label unnnic-tooltip-label-bottom" data-testid="tooltip-label" style="left: 0px; top: 8px;">Tooltip text <br data-v-bf0cf546=""><!--v-if--></span></div>
8
8
  </li>
9
9
  <li data-v-b4e39fac="" class="tab-head tab-head--active">tab2
10
10
  <!--v-if-->
@@ -42,7 +42,7 @@ exports[`TableNext.vue > matches the snapshot 1`] = `
42
42
  <p data-v-e29458bb="" class="table-pagination__count" data-testid="count">1 - 1 of 1</p>
43
43
  <div data-v-0eeff8cb="" data-v-e29458bb="" class="pagination"><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="previous-button" disabled="" class="unnnic-button unnnic-button--size-small unnnic-button--tertiary unnnic-button--icon-on-center">
44
44
  <!--v-if-->
45
- <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_left</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
45
+ <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--ant unnnic-icon__size--ant" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_left</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
46
46
  <!--v-if-->
47
47
  </button><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="page-button" class="unnnic-button unnnic-button--size-small unnnic-button--secondary">
48
48
  <!--v-if-->
@@ -51,7 +51,7 @@ exports[`TableNext.vue > matches the snapshot 1`] = `
51
51
  <!--v-if-->
52
52
  </button><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="next-button" disabled="" class="unnnic-button unnnic-button--size-small unnnic-button--tertiary unnnic-button--icon-on-center">
53
53
  <!--v-if-->
54
- <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_right</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
54
+ <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--ant unnnic-icon__size--ant" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_right</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
55
55
  <!--v-if-->
56
56
  </button></div>
57
57
  </section>
@@ -5,7 +5,7 @@ exports[`TablePagination.vue > matches the snapshot 1`] = `
5
5
  <p data-v-e29458bb="" class="table-pagination__count" data-testid="count">1 - 10 of 100</p>
6
6
  <div data-v-0eeff8cb="" data-v-e29458bb="" class="pagination"><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="previous-button" disabled="" class="unnnic-button unnnic-button--size-small unnnic-button--tertiary unnnic-button--icon-on-center">
7
7
  <!--v-if-->
8
- <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_left</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
8
+ <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-clean unnnic-icon-size--ant unnnic-icon__size--ant" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_left</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
9
9
  <!--v-if-->
10
10
  </button><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="page-button" class="unnnic-button unnnic-button--size-small unnnic-button--secondary">
11
11
  <!--v-if-->
@@ -34,7 +34,7 @@ exports[`TablePagination.vue > matches the snapshot 1`] = `
34
34
  <!--v-if-->
35
35
  </button><button data-v-ceff2a60="" data-v-0eeff8cb="" data-test="next-button" class="unnnic-button unnnic-button--size-small unnnic-button--tertiary unnnic-button--icon-on-center">
36
36
  <!--v-if-->
37
- <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-dark unnnic-icon-size--sm unnnic-icon__size--sm" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_right</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
37
+ <!--v-if--><span data-v-26446d8e="" data-v-ceff2a60="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-dark unnnic-icon-size--ant unnnic-icon__size--ant" data-testid="icon-center" translate="no" style="visibility: visible;">chevron_right</span><span data-v-ceff2a60="" class="unnnic-button__label" style="visibility: visible;" data-testid="button-label"> </span>
38
38
  <!--v-if-->
39
39
  </button></div>
40
40
  </section>"
@@ -4,7 +4,7 @@
4
4
  :size="size"
5
5
  :disabled="disabled"
6
6
  :message="message"
7
- :error="errors.join(', ') || type === 'error'"
7
+ :error="computedError"
8
8
  >
9
9
  <textarea
10
10
  ref="textarea"
@@ -18,13 +18,14 @@
18
18
  :disabled="disabled"
19
19
  :value="modelValue"
20
20
  @input="$emit('update:modelValue', fullySanitize($event.target.value))"
21
- ></textarea>
21
+ />
22
22
 
23
23
  <template
24
24
  v-if="maxLength"
25
25
  #rightMessage
26
- >{{ modelValue.length }}/{{ maxLength }}</template
27
26
  >
27
+ {{ modelValue.length }}/{{ maxLength }}
28
+ </template>
28
29
  </UnnnicFormElement>
29
30
  </template>
30
31
 
@@ -43,6 +44,14 @@ export default {
43
44
  default: 'md',
44
45
  },
45
46
 
47
+ resize: {
48
+ type: String,
49
+ default: 'vertical',
50
+ validator(value) {
51
+ return ['none', 'vertical'].indexOf(value) !== -1;
52
+ },
53
+ },
54
+
46
55
  label: {
47
56
  type: String,
48
57
  },
@@ -83,6 +92,16 @@ export default {
83
92
  },
84
93
  emits: ['update:modelValue'],
85
94
 
95
+ computed: {
96
+ computedError() {
97
+ if (Array.isArray(this.errors)) {
98
+ return this.errors.join(', ') || this.type === 'error';
99
+ }
100
+
101
+ return this.errors || this.type === 'error';
102
+ },
103
+ },
104
+
86
105
  methods: {
87
106
  fullySanitize,
88
107
  focus() {
@@ -96,31 +115,35 @@ export default {
96
115
  @use '@/assets/scss/unnnic' as *;
97
116
  @use '@/components/Input/Input' as *;
98
117
 
118
+ * {
119
+ margin: 0;
120
+ padding: 0;
121
+ box-sizing: border-box;
122
+ }
123
+
99
124
  .unnnic-text-area {
100
125
  &__textarea {
101
126
  @include input-base;
102
127
 
103
128
  display: block;
104
129
  width: 100%;
105
- resize: vertical;
106
- box-sizing: border-box;
130
+
131
+ resize: v-bind(resize);
107
132
 
108
133
  scrollbar-width: thin;
109
134
 
135
+ padding: $unnnic-space-3 $unnnic-space-4;
136
+
110
137
  &--size-md {
111
138
  @include input-md-font;
112
139
 
113
- min-height: 6.25 * $unnnic-font-size;
114
- padding: ($unnnic-spacing-ant - $unnnic-border-width-thinner)
115
- ($unnnic-spacing-sm - $unnnic-border-width-thinner);
140
+ min-height: 90px;
116
141
  }
117
142
 
118
143
  &--size-sm {
119
144
  @include input-sm-font;
120
145
 
121
- min-height: 5 * $unnnic-font-size;
122
- padding: ($unnnic-spacing-xs)
123
- ($unnnic-spacing-sm - $unnnic-border-width-thinner);
146
+ min-height: $unnnic-space-20;
124
147
  }
125
148
 
126
149
  &.unnnic-text-area__textarea--type-error {
@@ -2,8 +2,16 @@
2
2
 
3
3
  exports[`TextArea.vue > matches the snapshot 1`] = `
4
4
  "<section data-v-9f8d6c86="" data-v-735b3c51="" class="unnnic-form-element">
5
- <p data-v-9f8d6c86="" class="unnnic-form-element__label">Description</p><textarea data-v-735b3c51="" class="unnnic-text-area__textarea unnnic-text-area__textarea--size-md unnnic-text-area__textarea--type-normal" placeholder="Enter text" maxlength="200" value=""></textarea>
6
- <!--v-if-->
7
- <p data-v-9f8d6c86="" class="unnnic-form-element__message"> <span data-v-9f8d6c86="" class="unnnic-form-element__right-message">0/200</span></p>
5
+ <section data-v-7f222291="" data-v-9f8d6c86="" class="unnnic-label unnnic-form-element__label">
6
+ <p data-v-7f222291="" class="unnnic-label__label">Description</p>
7
+ <!--v-if-->
8
+ </section><textarea data-v-735b3c51="" class="unnnic-text-area__textarea unnnic-text-area__textarea--size-md unnnic-text-area__textarea--type-normal" placeholder="Enter text" maxlength="200" value=""></textarea>
9
+ <section data-v-9f8d6c86="" class="unnnic-form-element__hints-container">
10
+ <section data-v-9f8d6c86="" class="unnnic-form-element__message-container">
11
+ <!--v-if-->
12
+ <!--v-if-->
13
+ </section>
14
+ <p data-v-9f8d6c86="">0/200</p>
15
+ </section>
8
16
  </section>"
9
17
  `;
@@ -0,0 +1,246 @@
1
+ <template>
2
+ <Transition
3
+ name="toast-slide"
4
+ appear
5
+ data-testid="toast-transition"
6
+ @after-leave="$emit('destroy')"
7
+ >
8
+ <aside
9
+ v-if="isVisible"
10
+ :class="['unnnic-toast', `unnnic-toast--${type}`]"
11
+ :role="type === 'error' ? 'alert' : 'status'"
12
+ :aria-live="type === 'error' ? 'assertive' : 'polite'"
13
+ data-testid="toast"
14
+ >
15
+ <section
16
+ class="unnnic-toast__content"
17
+ data-testid="toast-content"
18
+ >
19
+ <header
20
+ class="unnnic-toast__header"
21
+ data-testid="toast-header"
22
+ >
23
+ <UnnnicIcon
24
+ :icon="typeConfig.icon"
25
+ :scheme="typeConfig.scheme"
26
+ size="ant"
27
+ data-testid="toast-type-icon"
28
+ />
29
+
30
+ <h3
31
+ class="unnnic-toast__title"
32
+ data-testid="toast-title"
33
+ >
34
+ {{ title }}
35
+ </h3>
36
+
37
+ <UnnnicIcon
38
+ icon="close"
39
+ scheme="neutral-dark"
40
+ size="ant"
41
+ clickable
42
+ class="unnnic-toast__close"
43
+ data-testid="toast-close-icon"
44
+ @click="handleClose"
45
+ @keydown.enter="handleClose"
46
+ />
47
+ </header>
48
+
49
+ <p
50
+ v-if="description"
51
+ data-testid="toast-text"
52
+ class="unnnic-toast__text"
53
+ >
54
+ {{ description }}
55
+ </p>
56
+ </section>
57
+
58
+ <UnnnicButton
59
+ v-if="button"
60
+ type="tertiary"
61
+ :text="button.text"
62
+ class="unnnic-toast__action-button"
63
+ data-testid="toast-action-button"
64
+ @click="handleAction"
65
+ @keydown.enter="handleAction"
66
+ @keydown.space.prevent="handleAction"
67
+ />
68
+ </aside>
69
+ </Transition>
70
+ </template>
71
+
72
+ <script setup lang="ts">
73
+ import { ref, computed, onMounted, onUnmounted } from 'vue';
74
+
75
+ import UnnnicIcon from '@/components/Icon.vue';
76
+ import UnnnicButton from '@/components/Button/Button.vue';
77
+
78
+ import type { ToastProps, ToastEmits } from './types';
79
+ import type { SchemeColor } from '@/types/scheme-colors';
80
+
81
+ defineOptions({
82
+ name: 'UnnnicToast',
83
+ });
84
+
85
+ const props = withDefaults(defineProps<ToastProps>(), {
86
+ title: '',
87
+ description: '',
88
+ button: undefined,
89
+ timeout: 5000,
90
+ type: 'informational',
91
+ });
92
+
93
+ const emit = defineEmits<ToastEmits>();
94
+
95
+ const isVisible = ref(false);
96
+ let timeoutId: number | null = null;
97
+
98
+ const typeConfig = computed(() => {
99
+ const configMap = {
100
+ informational: { icon: 'info', scheme: 'blue-500' },
101
+ attention: { icon: 'error', scheme: 'yellow-500' },
102
+ success: { icon: 'check_circle', scheme: 'green-500' },
103
+ error: { icon: 'cancel', scheme: 'red-500' },
104
+ };
105
+
106
+ return configMap[props.type || 'informational'] as {
107
+ icon: string;
108
+ scheme: SchemeColor;
109
+ };
110
+ });
111
+
112
+ const handleClose = () => {
113
+ isVisible.value = false;
114
+ emit('close');
115
+ };
116
+
117
+ const handleAction = () => {
118
+ if (props.button?.action) {
119
+ props.button.action();
120
+ }
121
+ };
122
+
123
+ const startTimeout = () => {
124
+ if (props.timeout > 0) {
125
+ timeoutId = window.setTimeout(() => {
126
+ handleClose();
127
+ }, props.timeout);
128
+ }
129
+ };
130
+
131
+ const clearTimeout = () => {
132
+ if (timeoutId) {
133
+ window.clearTimeout(timeoutId);
134
+ timeoutId = null;
135
+ }
136
+ };
137
+
138
+ onMounted(() => {
139
+ isVisible.value = true;
140
+ startTimeout();
141
+ });
142
+
143
+ onUnmounted(() => {
144
+ clearTimeout();
145
+ });
146
+ </script>
147
+
148
+ <style lang="scss" scoped>
149
+ @use '@/assets/scss/unnnic' as *;
150
+
151
+ .unnnic-toast {
152
+ position: fixed;
153
+ bottom: $unnnic-space-4;
154
+ right: $unnnic-space-4;
155
+ z-index: 9999;
156
+
157
+ display: flex;
158
+ align-items: flex-end;
159
+ flex-direction: column;
160
+ gap: $unnnic-space-2;
161
+
162
+ min-width: 250px;
163
+ max-width: 450px;
164
+ padding: $unnnic-space-4;
165
+
166
+ border-radius: $unnnic-radius-2;
167
+ box-shadow: $unnnic-shadow-2;
168
+ border: 1px solid $unnnic-color-border-base;
169
+
170
+ &--informational {
171
+ border-color: $unnnic-color-border-info;
172
+ background-color: $unnnic-color-bg-info;
173
+ }
174
+
175
+ &--attention {
176
+ border-color: $unnnic-color-border-warning;
177
+ background-color: $unnnic-color-bg-warning;
178
+ }
179
+
180
+ &--success {
181
+ border-color: $unnnic-color-border-success;
182
+ background-color: $unnnic-color-bg-success;
183
+ }
184
+
185
+ &--error {
186
+ border-color: $unnnic-color-border-critical;
187
+ background-color: $unnnic-color-bg-critical;
188
+ }
189
+
190
+ &__content,
191
+ &__header {
192
+ width: 100%;
193
+
194
+ display: flex;
195
+ gap: $unnnic-space-2;
196
+ }
197
+
198
+ &__content {
199
+ flex-direction: column;
200
+ gap: $unnnic-space-2;
201
+ }
202
+
203
+ &__header {
204
+ align-items: center;
205
+ }
206
+
207
+ &__title {
208
+ flex: 1;
209
+
210
+ margin: 0;
211
+
212
+ font: $unnnic-font-action;
213
+ color: $unnnic-color-fg-emphasized;
214
+ }
215
+
216
+ &__text {
217
+ margin: 0;
218
+ margin-left: $unnnic-space-7;
219
+
220
+ font: $unnnic-font-caption-2;
221
+ color: $unnnic-color-fg-emphasized;
222
+ }
223
+ }
224
+
225
+ // Animations
226
+ .toast-slide-enter-active,
227
+ .toast-slide-leave-active {
228
+ transition: all 0.3s ease;
229
+ }
230
+
231
+ .toast-slide-enter-from {
232
+ transform: translateY(100%);
233
+ opacity: 0;
234
+ }
235
+
236
+ .toast-slide-leave-to {
237
+ transform: translateY(100%);
238
+ opacity: 0;
239
+ }
240
+
241
+ .toast-slide-enter-to,
242
+ .toast-slide-leave-from {
243
+ transform: translateY(0);
244
+ opacity: 1;
245
+ }
246
+ </style>
@@ -0,0 +1,110 @@
1
+ import { createApp } from 'vue';
2
+ import Toast from './Toast.vue';
3
+ import type {
4
+ ToastProps,
5
+ ToastInstance,
6
+ ToastOptions,
7
+ ToastCall,
8
+ } from './types';
9
+
10
+ class ToastManager implements ToastManager {
11
+ private toasts: Map<string, ToastInstance> = new Map();
12
+ private container: HTMLElement | null = null;
13
+ private nextId = 0;
14
+
15
+ private createContainer(): HTMLElement {
16
+ if (this.container) {
17
+ return this.container;
18
+ }
19
+
20
+ this.container = document.createElement('div');
21
+ this.container.setAttribute('unnnic-toast-container', 'true');
22
+
23
+ document.body.appendChild(this.container);
24
+ return this.container;
25
+ }
26
+
27
+ private generateId(): string {
28
+ return `toast-${++this.nextId}`;
29
+ }
30
+
31
+ show(props: ToastProps): ToastInstance {
32
+ const id = this.generateId();
33
+ const container = this.createContainer();
34
+
35
+ const toastWrapper = document.createElement('div');
36
+
37
+ // Create promise that resolves when toast is destroyed
38
+ let resolvePromise: () => void;
39
+ const promise = new Promise<void>((resolve) => {
40
+ resolvePromise = resolve;
41
+ });
42
+
43
+ const app = createApp(Toast, {
44
+ ...props,
45
+ onClose: () => {
46
+ this.close(id);
47
+ },
48
+ onDestroy: () => {
49
+ app.unmount();
50
+ toastWrapper.remove();
51
+ resolvePromise(); // Resolve the promise when toast is destroyed
52
+ },
53
+ });
54
+
55
+ app.mount(toastWrapper);
56
+ container.appendChild(toastWrapper);
57
+
58
+ const toastInstance: ToastInstance = {
59
+ id,
60
+ props,
61
+ close: () => this.close(id),
62
+ promise,
63
+ };
64
+
65
+ this.toasts.set(id, toastInstance);
66
+ return toastInstance;
67
+ }
68
+
69
+ close(id: string): void {
70
+ const toast = this.toasts.get(id);
71
+ if (toast) {
72
+ this.toasts.delete(id);
73
+ }
74
+ }
75
+ }
76
+
77
+ const toastManager = new ToastManager();
78
+
79
+ export const toast: ToastCall = {
80
+ info: (title: string, description?: string, options?: ToastOptions) =>
81
+ toastManager.show({
82
+ title,
83
+ description,
84
+ ...options,
85
+ type: 'informational',
86
+ }).promise,
87
+ success: (title: string, description?: string, options?: ToastOptions) =>
88
+ toastManager.show({
89
+ title,
90
+ description,
91
+ ...options,
92
+ type: 'success',
93
+ }).promise,
94
+ attention: (title: string, description?: string, options?: ToastOptions) =>
95
+ toastManager.show({
96
+ title,
97
+ description,
98
+ ...options,
99
+ type: 'attention',
100
+ }).promise,
101
+ error: (title: string, description?: string, options?: ToastOptions) =>
102
+ toastManager.show({
103
+ title,
104
+ description,
105
+ ...options,
106
+ type: 'error',
107
+ }).promise,
108
+ };
109
+
110
+ export default toastManager;