@weni/unnnic-system 3.9.4 → 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 (236) hide show
  1. package/CHANGELOG.md +94 -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/MarketplaceCard.vue.d.ts.map +1 -1
  31. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  32. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  33. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  34. package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
  35. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  36. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  37. package/dist/components/Carousel/Carousel.vue.d.ts +13 -416
  38. package/dist/components/Carousel/TagCarousel.vue.d.ts +12 -415
  39. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  40. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  41. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  42. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +21 -446
  43. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  44. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  45. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  46. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  47. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  48. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  49. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  50. package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
  51. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  52. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
  53. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
  54. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  55. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  56. package/dist/components/DataTable/index.vue.d.ts +1 -1
  57. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  58. package/dist/components/DateFilter/DateFilter.vue.d.ts +170 -39
  59. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  60. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  61. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  62. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  63. package/dist/components/Flag.vue.d.ts +2 -2
  64. package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
  65. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  66. package/dist/components/Icon.vue.d.ts +1 -1
  67. package/dist/components/Icon.vue.d.ts.map +1 -1
  68. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  69. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  70. package/dist/components/Input/BaseInput.vue.d.ts +11 -2
  71. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  72. package/dist/components/Input/Input.vue.d.ts +170 -39
  73. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  74. package/dist/components/Input/TextInput.vue.d.ts +33 -24
  75. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  76. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +175 -44
  77. package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
  78. package/dist/components/Label/Label.vue.d.ts +9 -15
  79. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  80. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  81. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +6 -6
  82. package/dist/components/ModalNext/ModalNext.vue.d.ts +175 -44
  83. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +9 -9
  84. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  85. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +26 -14
  86. package/dist/components/PageHeader/PageHeader.vue.d.ts +28 -0
  87. package/dist/components/PageHeader/PageHeader.vue.d.ts.map +1 -0
  88. package/dist/components/PageHeader/index.d.ts +3 -0
  89. package/dist/components/PageHeader/index.d.ts.map +1 -0
  90. package/dist/components/PageHeader/types.d.ts +9 -0
  91. package/dist/components/PageHeader/types.d.ts.map +1 -0
  92. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  93. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  94. package/dist/components/Radio/Radio.vue.d.ts +10 -6
  95. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  96. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +68 -469
  97. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +11 -414
  98. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  99. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  100. package/dist/components/SelectTime/index.vue.d.ts +33 -24
  101. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  102. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  103. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  104. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  105. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  106. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  107. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  108. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  109. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  110. package/dist/components/Tag/DefaultTag.vue.d.ts +4 -83
  111. package/dist/components/Tag/DefaultTag.vue.d.ts.map +1 -1
  112. package/dist/components/Tag/Tag.vue.d.ts +12 -414
  113. package/dist/components/Tag/Tag.vue.d.ts.map +1 -1
  114. package/dist/components/Tag/types.d.ts +18 -0
  115. package/dist/components/Tag/types.d.ts.map +1 -0
  116. package/dist/components/TextArea/TextArea.vue.d.ts +78 -33
  117. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  118. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  119. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  120. package/dist/components/Toast/ToastManager.d.ts +14 -0
  121. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  122. package/dist/components/Toast/types.d.ts +35 -0
  123. package/dist/components/Toast/types.d.ts.map +1 -0
  124. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  125. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  126. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  127. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  128. package/dist/components/index.d.ts +8910 -10904
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  131. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  132. package/dist/{es-8146fb1b.mjs → es-e3248052.mjs} +1 -1
  133. package/dist/{index-724ed422.mjs → index-f67d5b30.mjs} +9292 -8808
  134. package/dist/{pt-br-af294ec9.mjs → pt-br-f6f53acd.mjs} +1 -1
  135. package/dist/style.css +1 -1
  136. package/dist/unnnic.mjs +181 -173
  137. package/dist/unnnic.umd.js +35 -36
  138. package/dist/utils/call.d.ts +2 -1
  139. package/dist/utils/call.d.ts.map +1 -1
  140. package/package.json +2 -2
  141. package/src/assets/fonts/material-symbols-rounded.woff2 +0 -0
  142. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  143. package/src/assets/icons/checkbox-checked.svg +3 -0
  144. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  145. package/src/assets/icons/checkbox-less.svg +3 -0
  146. package/src/assets/icons/radio-checked.svg +3 -0
  147. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  148. package/src/assets/icons/switch-checked.svg +3 -0
  149. package/src/components/Alert/Alert.vue +26 -135
  150. package/src/components/Alert/Version1dot1.vue +0 -36
  151. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  152. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  153. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  154. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  155. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +1 -1
  156. package/src/components/Button/Button.vue +67 -117
  157. package/src/components/Button/types.ts +0 -1
  158. package/src/components/Card/MarketplaceCard.vue +1 -0
  159. package/src/components/ChatsContact/ChatsContact.vue +10 -6
  160. package/src/components/Checkbox/Checkbox.vue +117 -65
  161. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  162. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  163. package/src/components/Collapse/Collapse.vue +1 -1
  164. package/src/components/Collapse/__tests__/__snapshots__/Collapse.spec.js.snap +1 -1
  165. package/src/components/FormElement/FormElement.vue +63 -93
  166. package/src/components/Icon.vue +4 -10
  167. package/src/components/Input/BaseInput.vue +12 -12
  168. package/src/components/Input/Input.scss +19 -20
  169. package/src/components/Input/Input.vue +60 -55
  170. package/src/components/Input/TextInput.vue +25 -54
  171. package/src/components/Input/__test__/Input.spec.js +13 -33
  172. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  173. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  174. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  175. package/src/components/Label/Label.vue +52 -21
  176. package/src/components/Label/__tests__/Label.spec.js +1 -1
  177. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  178. package/src/components/PageHeader/PageHeader.vue +148 -0
  179. package/src/components/PageHeader/index.ts +2 -0
  180. package/src/components/PageHeader/types.ts +10 -0
  181. package/src/components/Radio/Radio.vue +118 -66
  182. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  183. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +4 -3
  184. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  185. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  186. package/src/components/Switch/Switch.vue +132 -91
  187. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  188. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  189. package/src/components/Tab/Tab.vue +37 -23
  190. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  191. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  192. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  193. package/src/components/Tag/DefaultTag.vue +51 -107
  194. package/src/components/Tag/Tag.vue +32 -79
  195. package/src/components/Tag/types.ts +19 -0
  196. package/src/components/TextArea/TextArea.vue +41 -12
  197. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  198. package/src/components/Toast/Toast.vue +246 -0
  199. package/src/components/Toast/ToastManager.ts +110 -0
  200. package/src/components/Toast/__tests__/Toast.spec.js +291 -0
  201. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  202. package/src/components/Toast/types.ts +57 -0
  203. package/src/components/index.ts +33 -17
  204. package/src/stories/Alert.stories.js +6 -67
  205. package/src/stories/Button.stories.js +29 -39
  206. package/src/stories/Checkbox.stories.js +11 -4
  207. package/src/stories/CheckboxGroup.stories.js +105 -0
  208. package/src/stories/Icon.stories.js +2 -0
  209. package/src/stories/Input.stories.js +71 -76
  210. package/src/stories/Label.stories.js +7 -0
  211. package/src/stories/PageHeader.stories.js +330 -0
  212. package/src/stories/Radio.stories.js +28 -1
  213. package/src/stories/RadioGroup.stories.js +144 -0
  214. package/src/stories/Switch.stories.js +10 -5
  215. package/src/stories/Tab.stories.js +11 -4
  216. package/src/stories/Tag.stories.js +24 -43
  217. package/src/stories/TextArea.stories.js +14 -2
  218. package/src/stories/Toast.mdx +123 -0
  219. package/src/stories/Toast.stories.js +126 -0
  220. package/src/types/scheme-colors.d.ts +1 -0
  221. package/src/utils/call.js +46 -18
  222. package/dist/components/Tag/BrandTag.vue.d.ts +0 -51
  223. package/dist/components/Tag/BrandTag.vue.d.ts.map +0 -1
  224. package/dist/components/Tag/IndicatorTag.vue.d.ts +0 -151
  225. package/dist/components/Tag/IndicatorTag.vue.d.ts.map +0 -1
  226. package/dist/components/Tag/TagNext.vue.d.ts +0 -24
  227. package/dist/components/Tag/TagNext.vue.d.ts.map +0 -1
  228. package/src/assets/fonts/Material Symbols Rounded Filled.woff2 +0 -0
  229. package/src/assets/fonts/Material Symbols Rounded.woff2 +0 -0
  230. package/src/components/Alert/AlertBanner.vue +0 -182
  231. package/src/components/Alert/AlertCaller.vue +0 -49
  232. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  233. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
  234. package/src/components/Tag/BrandTag.vue +0 -96
  235. package/src/components/Tag/IndicatorTag.vue +0 -107
  236. package/src/components/Tag/TagNext.vue +0 -60
@@ -1,19 +1,14 @@
1
1
  <template>
2
- <div :class="['unnnic-form', size]">
3
- <p
4
- v-if="hasLabelSlot"
5
- class="unnnic-form__label"
6
- >
7
- <slot name="label" />
8
- </p>
9
-
10
- <p
11
- v-else-if="label"
12
- class="unnnic-form__label"
13
- >
14
- {{ fullySanitize(label) }}
15
- </p>
16
-
2
+ <UnnnicFormElement
3
+ :label="label || $slots.label"
4
+ :size="size"
5
+ :disabled="disabled"
6
+ :message="message"
7
+ :tooltip="tooltip"
8
+ :error="computedError"
9
+ :class="['unnnic-form', size]"
10
+ data-testid="form-element"
11
+ >
17
12
  <TextInput
18
13
  v-bind="$attrs"
19
14
  v-model="val"
@@ -21,31 +16,37 @@
21
16
  :placeholder="placeholder"
22
17
  :iconLeft="iconLeft"
23
18
  :iconRight="iconRight"
24
- :type="type"
19
+ :type="errors.length > 0 && !disabled ? 'error' : type"
25
20
  :iconLeftClickable="iconLeftClickable"
26
21
  :iconRightClickable="iconRightClickable"
27
22
  :hasCloudyColor="hasCloudyColor"
28
23
  :size="size"
29
24
  :mask="mask"
30
25
  :nativeType="nativeType"
26
+ :maxlength="maxlength"
27
+ :disabled="disabled"
31
28
  />
32
29
 
33
- <p
34
- v-if="message"
35
- class="unnnic-form__message"
30
+ <template
31
+ v-if="maxlength && showMaxlengthCounter"
32
+ #rightMessage
36
33
  >
37
- {{ fullySanitize(message) }}
38
- </p>
39
- </div>
34
+ {{ (val || '').length }} / {{ maxlength }}
35
+ </template>
36
+ </UnnnicFormElement>
40
37
  </template>
41
38
 
42
39
  <script>
43
40
  import { fullySanitize } from '../../utils/sanitize';
44
41
  import TextInput from './TextInput.vue';
42
+ import UnnnicFormElement from '../FormElement/FormElement.vue';
45
43
 
46
44
  export default {
47
45
  name: 'UnnnicInput',
48
- components: { TextInput },
46
+ components: {
47
+ TextInput,
48
+ UnnnicFormElement,
49
+ },
49
50
  props: {
50
51
  placeholder: {
51
52
  type: String,
@@ -68,19 +69,23 @@ export default {
68
69
  },
69
70
  message: {
70
71
  type: String,
71
- default: null,
72
+ default: '',
73
+ },
74
+ errors: {
75
+ type: [String, Array],
76
+ default: '',
72
77
  },
73
78
  label: {
74
79
  type: String,
75
- default: null,
80
+ default: '',
76
81
  },
77
82
  iconLeft: {
78
83
  type: String,
79
- default: null,
84
+ default: '',
80
85
  },
81
86
  iconRight: {
82
87
  type: String,
83
- default: null,
88
+ default: '',
84
89
  },
85
90
  allowTogglePassword: {
86
91
  type: Boolean,
@@ -88,11 +93,11 @@ export default {
88
93
  },
89
94
  iconLeftClickable: {
90
95
  type: Boolean,
91
- default: null,
96
+ default: false,
92
97
  },
93
98
  iconRightClickable: {
94
99
  type: Boolean,
95
- default: null,
100
+ default: false,
96
101
  },
97
102
  hasCloudyColor: {
98
103
  type: Boolean,
@@ -106,6 +111,22 @@ export default {
106
111
  type: [String, Array],
107
112
  default: '',
108
113
  },
114
+ tooltip: {
115
+ type: String,
116
+ default: '',
117
+ },
118
+ maxlength: {
119
+ type: [Number, null],
120
+ default: null,
121
+ },
122
+ showMaxlengthCounter: {
123
+ type: Boolean,
124
+ default: false,
125
+ },
126
+ disabled: {
127
+ type: Boolean,
128
+ default: false,
129
+ },
109
130
  },
110
131
  emits: ['update:modelValue'],
111
132
  data() {
@@ -114,8 +135,12 @@ export default {
114
135
  };
115
136
  },
116
137
  computed: {
117
- hasLabelSlot() {
118
- return !!this.$slots.label;
138
+ computedError() {
139
+ if (Array.isArray(this.errors)) {
140
+ return this.errors.join(', ') || this.type === 'error';
141
+ }
142
+
143
+ return this.errors || this.type === 'error';
119
144
  },
120
145
  },
121
146
  watch: {
@@ -136,29 +161,9 @@ export default {
136
161
  </script>
137
162
 
138
163
  <style lang="scss" scoped>
139
- @use '@/assets/scss/unnnic' as *;
140
-
141
- .unnnic-form {
142
- font-family: $unnnic-font-family-secondary;
143
- position: relative;
144
-
145
- &__message {
146
- font-size: $unnnic-font-size-body-md;
147
- margin: $unnnic-spacing-stack-nano 0;
148
- color: $unnnic-color-feedback-red;
149
- }
150
-
151
- &__label {
152
- font-weight: $unnnic-font-weight-regular;
153
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
154
- font-size: $unnnic-font-size-body-gt;
155
- color: $unnnic-color-neutral-cloudy;
156
- margin: $unnnic-spacing-stack-xs 0;
157
- }
158
-
159
- &.sm &__label {
160
- font-size: $unnnic-font-size-body-md;
161
- line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
162
- }
164
+ * {
165
+ margin: 0;
166
+ padding: 0;
167
+ box-sizing: border-box;
163
168
  }
164
169
  </style>
@@ -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>"`;