@weni/unnnic-system 3.10.0 → 3.11.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 (228) hide show
  1. package/CHANGELOG.md +80 -0
  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 +170 -39
  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 +11 -2
  70. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  71. package/dist/components/Input/Input.vue.d.ts +170 -39
  72. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  73. package/dist/components/Input/TextInput.vue.d.ts +33 -24
  74. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  75. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +175 -44
  76. package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
  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 +6 -6
  81. package/dist/components/ModalNext/ModalNext.vue.d.ts +175 -44
  82. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +9 -9
  83. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  84. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +26 -14
  85. package/dist/components/PageHeader/PageHeader.vue.d.ts +28 -0
  86. package/dist/components/PageHeader/PageHeader.vue.d.ts.map +1 -0
  87. package/dist/components/PageHeader/index.d.ts +3 -0
  88. package/dist/components/PageHeader/index.d.ts.map +1 -0
  89. package/dist/components/PageHeader/types.d.ts +9 -0
  90. package/dist/components/PageHeader/types.d.ts.map +1 -0
  91. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  92. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  93. package/dist/components/Radio/Radio.vue.d.ts +10 -6
  94. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  95. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +68 -469
  96. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +11 -414
  97. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  98. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  99. package/dist/components/SelectTime/index.vue.d.ts +33 -24
  100. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  101. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  102. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  103. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  104. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  105. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  106. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  107. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  108. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  109. package/dist/components/Tag/DefaultTag.vue.d.ts +4 -83
  110. package/dist/components/Tag/DefaultTag.vue.d.ts.map +1 -1
  111. package/dist/components/Tag/Tag.vue.d.ts +12 -414
  112. package/dist/components/Tag/Tag.vue.d.ts.map +1 -1
  113. package/dist/components/Tag/types.d.ts +18 -0
  114. package/dist/components/Tag/types.d.ts.map +1 -0
  115. package/dist/components/TextArea/TextArea.vue.d.ts +78 -33
  116. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  117. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  118. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  119. package/dist/components/Toast/ToastManager.d.ts +14 -0
  120. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  121. package/dist/components/Toast/types.d.ts +35 -0
  122. package/dist/components/Toast/types.d.ts.map +1 -0
  123. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  124. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  125. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  126. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  127. package/dist/components/index.d.ts +8910 -10904
  128. package/dist/components/index.d.ts.map +1 -1
  129. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  130. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  131. package/dist/{es-4b899f97.mjs → es-e3248052.mjs} +1 -1
  132. package/dist/{index-23489897.mjs → index-f67d5b30.mjs} +9289 -8806
  133. package/dist/{pt-br-5a914a63.mjs → pt-br-f6f53acd.mjs} +1 -1
  134. package/dist/style.css +1 -1
  135. package/dist/unnnic.mjs +181 -173
  136. package/dist/unnnic.umd.js +35 -36
  137. package/dist/utils/call.d.ts +2 -1
  138. package/dist/utils/call.d.ts.map +1 -1
  139. package/package.json +2 -2
  140. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  141. package/src/assets/icons/checkbox-checked.svg +3 -0
  142. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  143. package/src/assets/icons/checkbox-less.svg +3 -0
  144. package/src/assets/icons/radio-checked.svg +3 -0
  145. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  146. package/src/assets/icons/switch-checked.svg +3 -0
  147. package/src/components/Alert/Alert.vue +26 -135
  148. package/src/components/Alert/Version1dot1.vue +0 -36
  149. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  150. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  151. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  152. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  153. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +1 -1
  154. package/src/components/Button/Button.vue +67 -117
  155. package/src/components/Button/types.ts +0 -1
  156. package/src/components/ChatsContact/ChatsContact.vue +10 -6
  157. package/src/components/Checkbox/Checkbox.vue +117 -65
  158. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  159. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  160. package/src/components/FormElement/FormElement.vue +63 -93
  161. package/src/components/Icon.vue +2 -0
  162. package/src/components/Input/BaseInput.vue +12 -12
  163. package/src/components/Input/Input.scss +19 -20
  164. package/src/components/Input/Input.vue +60 -55
  165. package/src/components/Input/TextInput.vue +25 -54
  166. package/src/components/Input/__test__/Input.spec.js +13 -33
  167. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  168. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  169. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  170. package/src/components/Label/Label.vue +52 -21
  171. package/src/components/Label/__tests__/Label.spec.js +1 -1
  172. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  173. package/src/components/PageHeader/PageHeader.vue +148 -0
  174. package/src/components/PageHeader/index.ts +2 -0
  175. package/src/components/PageHeader/types.ts +10 -0
  176. package/src/components/Radio/Radio.vue +118 -66
  177. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  178. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +4 -3
  179. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  180. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  181. package/src/components/Switch/Switch.vue +132 -91
  182. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  183. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  184. package/src/components/Tab/Tab.vue +37 -23
  185. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  186. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  187. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  188. package/src/components/Tag/DefaultTag.vue +51 -107
  189. package/src/components/Tag/Tag.vue +32 -79
  190. package/src/components/Tag/types.ts +19 -0
  191. package/src/components/TextArea/TextArea.vue +41 -12
  192. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  193. package/src/components/Toast/Toast.vue +246 -0
  194. package/src/components/Toast/ToastManager.ts +110 -0
  195. package/src/components/Toast/__tests__/Toast.spec.js +291 -0
  196. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  197. package/src/components/Toast/types.ts +57 -0
  198. package/src/components/index.ts +33 -17
  199. package/src/stories/Alert.stories.js +6 -67
  200. package/src/stories/Button.stories.js +29 -39
  201. package/src/stories/Checkbox.stories.js +11 -4
  202. package/src/stories/CheckboxGroup.stories.js +105 -0
  203. package/src/stories/Input.stories.js +71 -76
  204. package/src/stories/Label.stories.js +7 -0
  205. package/src/stories/PageHeader.stories.js +330 -0
  206. package/src/stories/Radio.stories.js +28 -1
  207. package/src/stories/RadioGroup.stories.js +144 -0
  208. package/src/stories/Switch.stories.js +10 -5
  209. package/src/stories/Tab.stories.js +11 -4
  210. package/src/stories/Tag.stories.js +24 -43
  211. package/src/stories/TextArea.stories.js +14 -2
  212. package/src/stories/Toast.mdx +123 -0
  213. package/src/stories/Toast.stories.js +126 -0
  214. package/src/types/scheme-colors.d.ts +1 -0
  215. package/src/utils/call.js +46 -18
  216. package/dist/components/Tag/BrandTag.vue.d.ts +0 -51
  217. package/dist/components/Tag/BrandTag.vue.d.ts.map +0 -1
  218. package/dist/components/Tag/IndicatorTag.vue.d.ts +0 -151
  219. package/dist/components/Tag/IndicatorTag.vue.d.ts.map +0 -1
  220. package/dist/components/Tag/TagNext.vue.d.ts +0 -24
  221. package/dist/components/Tag/TagNext.vue.d.ts.map +0 -1
  222. package/src/components/Alert/AlertBanner.vue +0 -182
  223. package/src/components/Alert/AlertCaller.vue +0 -49
  224. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  225. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
  226. package/src/components/Tag/BrandTag.vue +0 -96
  227. package/src/components/Tag/IndicatorTag.vue +0 -107
  228. package/src/components/Tag/TagNext.vue +0 -60
@@ -1,11 +1,5 @@
1
1
  <template>
2
- <div
3
- :class="[
4
- 'text-input',
5
- `size--${size}`,
6
- `text-input--icon-right-size-${iconRightSize}`,
7
- ]"
8
- >
2
+ <div :class="['text-input', `size--${size}`]">
9
3
  <BaseInput
10
4
  v-bind="attributes"
11
5
  ref="base-input"
@@ -18,6 +12,7 @@
18
12
  class="input-itself"
19
13
  :hasIconLeft="!!iconLeft"
20
14
  :hasIconRight="!!iconRight || allowTogglePassword"
15
+ :maxlength="maxlength"
21
16
  @focus="onFocus"
22
17
  @blur="onBlur"
23
18
  />
@@ -26,7 +21,7 @@
26
21
  v-if="iconLeft"
27
22
  :scheme="iconScheme"
28
23
  :icon="iconLeft"
29
- size="sm"
24
+ size="ant"
30
25
  :clickable="iconLeftClickable"
31
26
  :class="['icon-left', { clickable: iconLeftClickable }]"
32
27
  @click="onIconLeftClick"
@@ -36,7 +31,7 @@
36
31
  v-if="iconRightSvg"
37
32
  :scheme="iconScheme"
38
33
  :icon="iconRightSvg"
39
- :size="iconRightSize"
34
+ size="ant"
40
35
  :clickable="iconRightClickable || allowTogglePassword"
41
36
  :class="[
42
37
  'icon-right',
@@ -92,22 +87,22 @@ export default {
92
87
  type: Boolean,
93
88
  default: null,
94
89
  },
95
- iconRightSize: {
96
- type: String,
97
- default: 'sm',
98
- },
99
90
  allowTogglePassword: {
100
91
  type: Boolean,
101
92
  default: null,
102
93
  },
103
- hasCloudyColor: {
104
- type: Boolean,
105
- default: null,
106
- },
107
94
  size: {
108
95
  type: String,
109
96
  default: 'md',
110
97
  },
98
+ maxlength: {
99
+ type: Number,
100
+ default: null,
101
+ },
102
+ disabled: {
103
+ type: Boolean,
104
+ default: false,
105
+ },
111
106
  },
112
107
  emits: ['icon-left-click', 'icon-right-click'],
113
108
  data() {
@@ -118,7 +113,7 @@ export default {
118
113
  },
119
114
  computed: {
120
115
  isDisabled() {
121
- return this.$attrs.disabled;
116
+ return this.$attrs.disabled || this.disabled;
122
117
  },
123
118
 
124
119
  iconRightSvg() {
@@ -130,23 +125,11 @@ export default {
130
125
  },
131
126
 
132
127
  iconScheme() {
133
- if (this.type === 'error') {
134
- return 'aux-red-500';
135
- }
136
-
137
128
  if (this.isDisabled) {
138
- return 'neutral-cleanest';
139
- }
140
-
141
- if (this.modelValue || this.isFocused) {
142
- return 'neutral-dark';
143
- }
144
-
145
- if (this.hasCloudyColor) {
146
- return 'neutral-cloudy';
129
+ return 'fg-muted';
147
130
  }
148
131
 
149
- return 'neutral-cloudy';
132
+ return 'fg-base';
150
133
  },
151
134
 
152
135
  attributes() {
@@ -183,6 +166,10 @@ export default {
183
166
  <style lang="scss" scoped>
184
167
  @use '@/assets/scss/unnnic' as *;
185
168
 
169
+ .text-input {
170
+ position: relative;
171
+ }
172
+
186
173
  .icon {
187
174
  &-left,
188
175
  &-right {
@@ -193,32 +180,16 @@ export default {
193
180
 
194
181
  &-left {
195
182
  position: absolute;
196
- top: $unnnic-spacing-ant + 0.1875 * $unnnic-font-size;
197
- left: $unnnic-inline-sm - $unnnic-border-width-thinner;
183
+ top: 50%;
184
+ transform: translateY(-50%);
185
+ left: $unnnic-space-4;
198
186
  }
199
187
 
200
188
  &-right {
201
189
  position: absolute;
202
- top: $unnnic-spacing-ant + 0.1875 * $unnnic-font-size;
203
- right: $unnnic-inline-sm - $unnnic-border-width-thinner;
204
- }
205
- }
206
- .text-input {
207
- position: relative;
208
-
209
- &.size--sm {
210
- .icon-left,
211
- .icon-right {
212
- top: $unnnic-spacing-xs + 0.125 * $unnnic-font-size;
213
- }
214
- }
215
-
216
- &.size--sm.text-input--icon-right-size-ant .icon-right {
217
- top: 0.5625 * $unnnic-font-size;
218
- }
219
-
220
- &.size--md.text-input--icon-right-size-ant .icon-right {
221
- top: 0.8125 * $unnnic-font-size;
190
+ top: 50%;
191
+ transform: translateY(-50%);
192
+ right: $unnnic-space-4;
222
193
  }
223
194
  }
224
195
  </style>
@@ -40,29 +40,21 @@ describe('Input.vue', () => {
40
40
  expect(wrapper.exists()).toBe(true);
41
41
  });
42
42
 
43
- test('renders label correctly', async () => {
44
- const label = wrapper.find('.unnnic-form__label');
45
- expect(label.exists()).toBe(true);
46
- expect(label.text()).toBe('Sample Label');
47
-
48
- await wrapper.setProps({ label: null });
49
- expect(wrapper.find('.unnnic-form__label').exists()).toBe(false);
50
- });
51
-
52
- test('renders message correctly', async () => {
53
- const message = wrapper.find('.unnnic-form__message');
54
- expect(message.exists()).toBe(true);
55
- expect(message.text()).toBe('Error message');
56
-
57
- await wrapper.setProps({ message: null });
58
- expect(wrapper.find('.unnnic-form__message').exists()).toBe(false);
43
+ test('renders form element correctly', async () => {
44
+ const formElement = wrapper.findComponent('[data-testid="form-element"]');
45
+ expect(formElement.exists()).toBe(true);
46
+ expect(formElement.props('label')).toBe('Sample Label');
47
+ expect(formElement.props('size')).toBe('md');
48
+ expect(formElement.props('message')).toBe('Error message');
49
+ expect(formElement.props('disabled')).toBe(false);
50
+ expect(formElement.props('tooltip')).toBe('');
51
+ expect(formElement.props('error')).toBe(false);
59
52
  });
60
53
 
61
- test('applies the correct size class', async () => {
62
- expect(wrapper.classes()).toContain('md');
63
-
64
- await wrapper.setProps({ size: 'sm' });
65
- expect(wrapper.classes()).toContain('sm');
54
+ test('renders maxlength counter correctly', async () => {
55
+ expect(wrapper.text()).not.toContain('0 / 10');
56
+ await wrapper.setProps({ maxlength: 10, showMaxlengthCounter: true });
57
+ expect(wrapper.text()).toContain('0 / 10');
66
58
  });
67
59
 
68
60
  test('renders TextInput component', () => {
@@ -96,18 +88,6 @@ describe('Input.vue', () => {
96
88
  expect(wrapper.vm.val).toBe('new value');
97
89
  });
98
90
 
99
- test('hasLabelSlot computed property works correctly', async () => {
100
- expect(wrapper.vm.hasLabelSlot).toBe(false);
101
-
102
- wrapper = mount(Input, {
103
- slots: {
104
- label: '<span>Custom Label</span>',
105
- },
106
- });
107
-
108
- expect(wrapper.vm.hasLabelSlot).toBe(true);
109
- });
110
-
111
91
  test('correctly mounts with initial modelValue', async () => {
112
92
  wrapper = mount(Input, {
113
93
  props: {
@@ -19,7 +19,6 @@ describe('TextInput.vue', () => {
19
19
  iconLeftClickable: true,
20
20
  iconRightClickable: true,
21
21
  allowTogglePassword: false,
22
- hasCloudyColor: false,
23
22
  size: 'md',
24
23
  },
25
24
  global: {
@@ -74,22 +73,21 @@ describe('TextInput.vue', () => {
74
73
 
75
74
  test('computes the correct iconScheme based on various states', async () => {
76
75
  await wrapper.setProps({ type: 'error' });
77
- expect(wrapper.vm.iconScheme).toBe('aux-red-500');
76
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
78
77
 
79
78
  await wrapper.setProps({ type: 'normal' });
80
79
  await wrapper.setData({ isDisabled: true });
81
- expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
80
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
82
81
 
83
82
  await wrapper.setData({ isDisabled: false });
84
83
  await wrapper.setProps({ modelValue: 'text' });
85
- expect(wrapper.vm.iconScheme).toBe('neutral-dark');
84
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
86
85
 
87
86
  await wrapper.setData({ isFocused: true });
88
- expect(wrapper.vm.iconScheme).toBe('neutral-dark');
87
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
89
88
 
90
- await wrapper.setProps({ hasCloudyColor: true, modelValue: '' });
91
- await wrapper.setData({ isFocused: false });
92
- expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
89
+ await wrapper.setProps({ disabled: true });
90
+ expect(wrapper.vm.iconScheme).toBe('fg-muted');
93
91
  });
94
92
 
95
93
  test('attributes computed property returns combined attributes and props', () => {
@@ -1,9 +1,18 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`Input.vue > matches the snapshot 1`] = `
4
- "<div data-v-d890ad85="" class="unnnic-form md">
5
- <p data-v-d890ad85="" class="unnnic-form__label">Sample Label</p>
6
- <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md text-input--icon-right-size-sm unnnic-form-input" mask="####-####"><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-form-input input-itself input size-md normal input--has-icon-left input--has-icon-right unnnic-form-input input-itself" placeholder="Enter text" iconleft="search" iconright="clear" iconleftclickable="true" iconrightclickable="true" iconrightsize="sm" hascloudycolor="false" type="text" value=""><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-cloudy unnnic-icon-size--sm unnnic-icon__size--sm unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-cloudy unnnic-icon-size--sm unnnic-icon__size--sm unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span></div>
7
- <p data-v-d890ad85="" class="unnnic-form__message">Error message</p>
8
- </div>"
4
+ "<section data-v-9f8d6c86="" data-v-d890ad85="" class="unnnic-form-element unnnic-form md" data-testid="form-element">
5
+ <section data-v-7f222291="" data-v-9f8d6c86="" class="unnnic-label unnnic-form-element__label">
6
+ <p data-v-7f222291="" class="unnnic-label__label">Sample Label</p>
7
+ <!--v-if-->
8
+ </section>
9
+ <div data-v-a0d36167="" data-v-d890ad85="" class="text-input size--md unnnic-form-input" hascloudycolor="false" mask="####-####"><input data-v-86533b41="" data-v-a0d36167="" class="unnnic-form-input input-itself input size-md normal input--has-icon-left input--has-icon-right unnnic-form-input input-itself" hascloudycolor="false" placeholder="Enter text" iconleft="search" iconright="clear" iconleftclickable="true" iconrightclickable="true" type="text" value=""><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span></div>
10
+ <section data-v-9f8d6c86="" class="unnnic-form-element__hints-container">
11
+ <section data-v-9f8d6c86="" class="unnnic-form-element__message-container">
12
+ <p data-v-9f8d6c86="" class="unnnic-form-element__message">Error message</p>
13
+ <!--v-if-->
14
+ </section>
15
+ <!--v-if-->
16
+ </section>
17
+ </section>"
9
18
  `;
@@ -1,3 +1,3 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`TextInput.vue > matches the snapshot 1`] = `"<div data-v-a0d36167="" class="text-input size--md text-input--icon-right-size-sm"><input data-v-86533b41="" data-v-a0d36167="" placeholder="Enter text" iconleft="search" iconright="clear" iconleftclickable="true" iconrightclickable="true" iconrightsize="sm" allowtogglepassword="false" hascloudycolor="false" class="input-itself input size-md normal input--has-icon-left input--has-icon-right input-itself" type="text" value=""><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-cloudy unnnic-icon-size--sm unnnic-icon__size--sm unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--neutral-cloudy unnnic-icon-size--sm unnnic-icon__size--sm unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span></div>"`;
3
+ exports[`TextInput.vue > matches the snapshot 1`] = `"<div data-v-a0d36167="" class="text-input size--md"><input data-v-86533b41="" data-v-a0d36167="" placeholder="Enter text" iconleft="search" iconright="clear" iconleftclickable="true" iconrightclickable="true" allowtogglepassword="false" class="input-itself input size-md normal input--has-icon-left input--has-icon-right input-itself" type="text" value=""><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span><span data-v-26446d8e="" data-v-a0d36167="" class="unnnic-icon material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic-icon__size--ant unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span></div>"`;
@@ -1,34 +1,65 @@
1
1
  <template>
2
- <p class="unnnic-label__label">{{ fullySanitize(label) }}</p>
2
+ <section class="unnnic-label">
3
+ <p class="unnnic-label__label">{{ fullySanitize(props.label) }}</p>
4
+ <UnnnicToolTip
5
+ v-if="tooltip"
6
+ enabled
7
+ :text="tooltip"
8
+ :enableHtml="props.useHtmlTooltip"
9
+ >
10
+ <UnnnicIcon
11
+ icon="help"
12
+ size="sm"
13
+ scheme="fg-base"
14
+ />
15
+ </UnnnicToolTip>
16
+ </section>
3
17
  </template>
4
18
 
5
- <script>
6
- import { fullySanitize } from '../../utils/sanitize';
7
- export default {
19
+ <script setup lang="ts">
20
+ import { fullySanitize } from '@/utils/sanitize';
21
+
22
+ import UnnnicToolTip from '../ToolTip/ToolTip.vue';
23
+ import UnnnicIcon from '../Icon.vue';
24
+
25
+ defineOptions({
8
26
  name: 'UnnnicLabel',
9
- props: {
10
- label: {
11
- type: String,
12
- default: null,
13
- },
14
- },
15
- methods: {
16
- fullySanitize,
17
- },
18
- };
27
+ });
28
+
29
+ export interface LabelProps {
30
+ label?: string;
31
+ tooltip?: string;
32
+ useHtmlTooltip?: boolean;
33
+ }
34
+
35
+ const props = withDefaults(defineProps<LabelProps>(), {
36
+ label: '',
37
+ tooltip: '',
38
+ useHtmlTooltip: false,
39
+ });
19
40
  </script>
20
41
 
21
- <style lang="scss">
42
+ <style lang="scss" scoped>
22
43
  @use '@/assets/scss/unnnic' as *;
23
44
 
45
+ * {
46
+ box-sizing: border-box;
47
+ padding: $unnnic-space-0;
48
+ margin: $unnnic-space-0;
49
+ }
50
+
24
51
  .unnnic-label {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: $unnnic-space-2;
55
+ color: $unnnic-color-fg-base;
56
+
25
57
  &__label {
26
- font-family: $unnnic-font-family-secondary;
27
- font-weight: $unnnic-font-weight-regular;
28
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
29
- font-size: $unnnic-font-size-body-gt;
30
- color: $unnnic-color-neutral-cloudy;
31
- margin: $unnnic-spacing-stack-xs 0;
58
+ font: $unnnic-font-body;
59
+ }
60
+
61
+ :deep(.unnnic-tooltip) {
62
+ display: flex;
32
63
  }
33
64
  }
34
65
  </style>
@@ -24,7 +24,7 @@ describe('Label', () => {
24
24
  });
25
25
 
26
26
  it('applies the correct classes and styles', () => {
27
- const label = wrapper.findComponent('.unnnic-label__label');
27
+ const label = wrapper.find('.unnnic-label__label');
28
28
  expect(label.html()).toMatchSnapshot();
29
29
  });
30
30
  });
@@ -1,3 +1,3 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`Label > applies the correct classes and styles 1`] = `"<p class="unnnic-label__label">Label Test</p>"`;
3
+ exports[`Label > applies the correct classes and styles 1`] = `"<p data-v-7f222291="" class="unnnic-label__label">Label Test</p>"`;
@@ -0,0 +1,148 @@
1
+ <template>
2
+ <header
3
+ :class="`page-header
4
+ ${hasBackButton ? 'page-header--has-back-button' : ''}
5
+ ${$slots.tabs ? 'page-header--has-tabs' : ''}
6
+ `"
7
+ >
8
+ <UnnnicButton
9
+ v-if="hasBackButton"
10
+ data-testid="back-button"
11
+ type="tertiary"
12
+ iconCenter="arrow_back_ios_new"
13
+ class="page-header__back-button"
14
+ @click="handleBackClick"
15
+ />
16
+
17
+ <section class="page-header__infos">
18
+ <section class="page-header__main-infos">
19
+ <h1
20
+ class="page-header__title"
21
+ data-testid="page-title"
22
+ >
23
+ {{ title }}
24
+ </h1>
25
+
26
+ <slot name="tag" />
27
+ </section>
28
+
29
+ <p
30
+ v-if="description"
31
+ class="page-header__description"
32
+ data-testid="page-description"
33
+ >
34
+ {{ description }}
35
+ </p>
36
+ </section>
37
+
38
+ <section
39
+ v-if="$slots.actions"
40
+ class="page-header__actions"
41
+ data-testid="page-actions"
42
+ >
43
+ <slot name="actions" />
44
+ </section>
45
+
46
+ <section
47
+ v-if="$slots.tabs"
48
+ class="page-header__tabs"
49
+ data-testid="page-tabs"
50
+ >
51
+ <slot name="tabs" />
52
+ </section>
53
+ </header>
54
+ </template>
55
+
56
+ <script setup lang="ts">
57
+ import UnnnicButton from '../Button/Button.vue';
58
+
59
+ import type { PageHeaderProps, PageHeaderEmits } from './types';
60
+
61
+ withDefaults(defineProps<PageHeaderProps>(), {
62
+ description: '',
63
+ hasBackButton: false,
64
+ });
65
+
66
+ const emit = defineEmits<PageHeaderEmits>();
67
+
68
+ const handleBackClick = (): void => {
69
+ emit('back');
70
+ };
71
+ </script>
72
+
73
+ <style lang="scss" scoped>
74
+ @use '@/assets/scss/unnnic' as *;
75
+
76
+ * {
77
+ margin: 0;
78
+ padding: 0;
79
+ box-sizing: border-box;
80
+ }
81
+
82
+ .page-header {
83
+ width: 100%;
84
+
85
+ margin-top: $unnnic-space-2;
86
+ padding-bottom: $unnnic-space-6;
87
+
88
+ display: grid;
89
+ gap: $unnnic-space-4;
90
+ grid-template-columns: 1fr minmax(250px, 20%); // TODO: Verify if is 250px or 20% (8fr 2fr)
91
+ align-items: center;
92
+
93
+ border-bottom: 1px solid $unnnic-color-border-soft;
94
+
95
+ &--has-back-button {
96
+ grid-template-columns: auto 1fr minmax(250px, 20%);
97
+ }
98
+
99
+ &--has-tabs {
100
+ border-bottom: none;
101
+ }
102
+
103
+ &__infos {
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: $unnnic-space-2;
107
+ }
108
+
109
+ &__main-infos {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: $unnnic-space-2;
113
+ }
114
+
115
+ &__title {
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ white-space: nowrap;
119
+
120
+ color: $unnnic-color-fg-emphasized;
121
+ text-overflow: ellipsis;
122
+
123
+ font: $unnnic-font-display-1;
124
+ }
125
+
126
+ &__description {
127
+ color: $unnnic-color-fg-base;
128
+
129
+ font: $unnnic-font-body;
130
+ }
131
+
132
+ &__actions {
133
+ display: flex;
134
+ gap: $unnnic-space-2;
135
+ align-items: center;
136
+ justify-content: flex-end;
137
+
138
+ > * {
139
+ width: 100%;
140
+ }
141
+ }
142
+
143
+ &__tabs {
144
+ grid-column: 1 / -1;
145
+ grid-row: 2 / 3;
146
+ }
147
+ }
148
+ </style>
@@ -0,0 +1,2 @@
1
+ export { default } from './PageHeader.vue';
2
+ export { default as PageHeader } from './PageHeader.vue';
@@ -0,0 +1,10 @@
1
+ export interface PageHeaderProps {
2
+ title: string;
3
+ description?: string;
4
+
5
+ hasBackButton?: boolean;
6
+ }
7
+
8
+ export interface PageHeaderEmits {
9
+ (event: 'back'): void;
10
+ }