@weni/unnnic-system 3.8.2-alpha.1 → 3.9.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 +9 -1
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +116 -17
  4. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  5. package/dist/components/Alert/Version1dot1.vue.d.ts +38 -2
  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 +31 -24
  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 +34 -27
  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 +26 -19
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  50. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  51. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  52. package/dist/components/DataTable/index.vue.d.ts +1 -1
  53. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  54. package/dist/components/DateFilter/DateFilter.vue.d.ts +41 -251
  55. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  56. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  57. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  58. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  59. package/dist/components/Flag.vue.d.ts +2 -2
  60. package/dist/components/FormElement/FormElement.vue.d.ts +28 -51
  61. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  62. package/dist/components/Icon.vue.d.ts +1 -1
  63. package/dist/components/Icon.vue.d.ts.map +1 -1
  64. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  65. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  66. package/dist/components/Input/BaseInput.vue.d.ts +2 -33
  67. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  68. package/dist/components/Input/Input.vue.d.ts +41 -251
  69. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  70. package/dist/components/Input/TextInput.vue.d.ts +25 -85
  71. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  72. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +47 -257
  73. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  74. package/dist/components/Label/Label.vue.d.ts +15 -9
  75. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  76. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  77. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +34 -199
  78. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  79. package/dist/components/ModalNext/ModalNext.vue.d.ts +46 -256
  80. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +8 -8
  81. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  82. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +14 -20
  83. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  84. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  85. package/dist/components/Radio/Radio.vue.d.ts +6 -8
  86. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  87. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +60 -113
  88. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +5 -5
  89. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +28 -21
  90. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  91. package/dist/components/SelectTime/index.vue.d.ts +25 -85
  92. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  93. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  94. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  95. package/dist/components/Switch/Switch.vue.d.ts +21 -55
  96. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  97. package/dist/components/Tab/Tab.vue.d.ts +2 -13
  98. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  99. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  100. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  101. package/dist/components/Tag/BrandTag.vue.d.ts +1 -1
  102. package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
  103. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  104. package/dist/components/Tag/Tag.vue.d.ts +5 -5
  105. package/dist/components/TextArea/TextArea.vue.d.ts +30 -66
  106. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  107. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  108. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  109. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  110. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  111. package/dist/components/index.d.ts +1468 -3755
  112. package/dist/components/index.d.ts.map +1 -1
  113. package/dist/components/ui/popover/PopoverContent.vue.d.ts +1 -1
  114. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -1
  115. package/dist/components/ui/{dialog/Dialog.vue.d.ts → tabs/Tabs.vue.d.ts} +7 -6
  116. package/dist/components/ui/tabs/Tabs.vue.d.ts.map +1 -0
  117. package/dist/components/ui/{dialog/DialogTitle.vue.d.ts → tabs/TabsContent.vue.d.ts} +3 -3
  118. package/dist/components/ui/tabs/TabsContent.vue.d.ts.map +1 -0
  119. package/dist/components/ui/{dialog/DialogFooter.vue.d.ts → tabs/TabsList.vue.d.ts} +5 -7
  120. package/dist/components/ui/tabs/TabsList.vue.d.ts.map +1 -0
  121. package/dist/components/ui/{dialog/DialogHeader.vue.d.ts → tabs/TabsTrigger.vue.d.ts} +5 -11
  122. package/dist/components/ui/tabs/TabsTrigger.vue.d.ts.map +1 -0
  123. package/dist/components/ui/tabs/index.d.ts +5 -0
  124. package/dist/components/ui/tabs/index.d.ts.map +1 -0
  125. package/dist/{es-dc440fef.mjs → es-4b7090cd.mjs} +1 -1
  126. package/dist/{index-6b5eeee8.mjs → index-65c23d9a.mjs} +15213 -15538
  127. package/dist/locales/en.json.d.ts +1 -2
  128. package/dist/locales/es.json.d.ts +1 -2
  129. package/dist/locales/pt_br.json.d.ts +1 -2
  130. package/dist/{pt-br-a2cfd62d.mjs → pt-br-6324858c.mjs} +1 -1
  131. package/dist/style.css +1 -1
  132. package/dist/unnnic.mjs +185 -194
  133. package/dist/unnnic.umd.js +38 -42
  134. package/dist/utils/call.d.ts +1 -2
  135. package/dist/utils/call.d.ts.map +1 -1
  136. package/package.json +2 -2
  137. package/src/assets/scss/tailwind.scss +0 -8
  138. package/src/components/Alert/Alert.vue +135 -26
  139. package/src/components/Alert/AlertBanner.vue +182 -0
  140. package/src/components/Alert/AlertCaller.vue +49 -0
  141. package/src/components/Alert/Version1dot1.vue +36 -0
  142. package/src/components/Alert/__tests__/Alert.spec.js +45 -2
  143. package/src/components/Alert/__tests__/AlertBanner.spec.js +89 -0
  144. package/src/components/Alert/__tests__/AlertCaller.spec.js +98 -0
  145. package/src/components/Alert/__tests__/Version1dot1.spec.js +21 -0
  146. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
  147. package/src/components/Alert/__tests__/__snapshots__/AlertBanner.spec.js.snap +2 -2
  148. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +3 -3
  149. package/src/components/AvatarIcon/__tests__/__snapshots__/AvatarIcon.spec.js.snap +1 -1
  150. package/src/components/Button/Button.vue +117 -68
  151. package/src/components/Button/types.ts +1 -0
  152. package/src/components/Checkbox/Checkbox.vue +65 -117
  153. package/src/components/Checkbox/__tests__/Checkbox.spec.js +21 -6
  154. package/src/components/Collapse/__tests__/__snapshots__/Collapse.spec.js.snap +1 -3
  155. package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +3 -3
  156. package/src/components/FormElement/FormElement.vue +93 -63
  157. package/src/components/Icon.vue +0 -2
  158. package/src/components/Input/BaseInput.vue +14 -33
  159. package/src/components/Input/Input.scss +21 -20
  160. package/src/components/Input/Input.vue +56 -79
  161. package/src/components/Input/TextInput.vue +68 -80
  162. package/src/components/Input/__test__/Input.spec.js +33 -13
  163. package/src/components/Input/__test__/TextInput.spec.js +8 -6
  164. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +1 -1
  165. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  166. package/src/components/Label/Label.vue +21 -52
  167. package/src/components/Label/__tests__/Label.spec.js +1 -1
  168. package/src/components/ModalDialog/ModalDialog.vue +146 -60
  169. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +22 -1
  170. package/src/components/Radio/Radio.vue +67 -98
  171. package/src/components/Radio/__test__/Radio.spec.js +20 -14
  172. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +1 -1
  173. package/src/components/SelectSmart/SelectSmart.vue +3 -4
  174. package/src/components/Switch/Switch.vue +91 -132
  175. package/src/components/Switch/__tests__/Switch.spec.js +75 -8
  176. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +1 -1
  177. package/src/components/Tab/Tab.vue +23 -37
  178. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  179. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  180. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  181. package/src/components/TextArea/TextArea.vue +11 -34
  182. package/src/components/index.ts +27 -48
  183. package/src/components/ui/tabs/Tabs.vue +19 -0
  184. package/src/components/ui/tabs/TabsContent.vue +22 -0
  185. package/src/components/ui/tabs/TabsList.vue +34 -0
  186. package/src/components/ui/tabs/TabsTrigger.vue +79 -0
  187. package/src/components/ui/tabs/index.ts +4 -0
  188. package/src/locales/en.json +1 -2
  189. package/src/locales/es.json +1 -2
  190. package/src/locales/pt_br.json +1 -2
  191. package/src/stories/Alert.stories.js +67 -6
  192. package/src/stories/Button.stories.js +39 -29
  193. package/src/stories/Checkbox.stories.js +4 -11
  194. package/src/stories/Input.stories.js +76 -71
  195. package/src/stories/Label.stories.js +0 -7
  196. package/src/stories/ModalDialog.mdx +0 -3
  197. package/src/stories/ModalDialog.stories.js +1 -1
  198. package/src/stories/Switch.stories.js +5 -10
  199. package/src/stories/Tab.stories.js +4 -11
  200. package/src/stories/Tabs.stories.js +125 -0
  201. package/src/stories/TextArea.stories.js +2 -13
  202. package/src/types/scheme-colors.d.ts +0 -1
  203. package/src/utils/call.js +18 -46
  204. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +0 -28
  205. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +0 -1
  206. package/dist/components/Toast/Toast.vue.d.ts +0 -16
  207. package/dist/components/Toast/Toast.vue.d.ts.map +0 -1
  208. package/dist/components/Toast/ToastManager.d.ts +0 -14
  209. package/dist/components/Toast/ToastManager.d.ts.map +0 -1
  210. package/dist/components/Toast/types.d.ts +0 -35
  211. package/dist/components/Toast/types.d.ts.map +0 -1
  212. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +0 -1
  213. package/dist/components/ui/dialog/DialogClose.vue.d.ts +0 -19
  214. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +0 -1
  215. package/dist/components/ui/dialog/DialogContent.vue.d.ts +0 -40
  216. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +0 -1
  217. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +0 -1
  218. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +0 -1
  219. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +0 -1
  220. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +0 -19
  221. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +0 -1
  222. package/dist/components/ui/dialog/index.d.ts +0 -8
  223. package/dist/components/ui/dialog/index.d.ts.map +0 -1
  224. package/src/assets/icons/checkbox-checked-disabled.svg +0 -3
  225. package/src/assets/icons/checkbox-checked.svg +0 -3
  226. package/src/assets/icons/checkbox-less-disabled.svg +0 -3
  227. package/src/assets/icons/checkbox-less.svg +0 -3
  228. package/src/assets/icons/radio-checked.svg +0 -3
  229. package/src/assets/icons/switch-checked-disabled.svg +0 -3
  230. package/src/assets/icons/switch-checked.svg +0 -3
  231. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +0 -152
  232. package/src/components/CheckboxGroup/CheckboxGroup.vue +0 -96
  233. package/src/components/Popover/__tests__/Popover.spec.js +0 -147
  234. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
  235. package/src/components/Popover/index.vue +0 -146
  236. package/src/components/RadioGroup/RadioGroup.vue +0 -142
  237. package/src/components/Select/SelectOption.vue +0 -65
  238. package/src/components/Select/__tests__/Select.spec.js +0 -412
  239. package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
  240. package/src/components/Select/__tests__/SelectOption.spec.js +0 -174
  241. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -97
  242. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
  243. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
  244. package/src/components/Select/index.vue +0 -245
  245. package/src/components/Toast/Toast.vue +0 -246
  246. package/src/components/Toast/ToastManager.ts +0 -110
  247. package/src/components/Toast/__tests__/Toast.spec.js +0 -284
  248. package/src/components/Toast/__tests__/ToastManager.spec.js +0 -294
  249. package/src/components/Toast/types.ts +0 -57
  250. package/src/components/ui/dialog/Dialog.vue +0 -15
  251. package/src/components/ui/dialog/DialogClose.vue +0 -25
  252. package/src/components/ui/dialog/DialogContent.vue +0 -114
  253. package/src/components/ui/dialog/DialogFooter.vue +0 -46
  254. package/src/components/ui/dialog/DialogHeader.vue +0 -78
  255. package/src/components/ui/dialog/DialogTitle.vue +0 -34
  256. package/src/components/ui/dialog/DialogTrigger.vue +0 -12
  257. package/src/components/ui/dialog/index.ts +0 -7
  258. package/src/stories/CheckboxGroup.stories.js +0 -105
  259. package/src/stories/Dialog.stories.js +0 -832
  260. package/src/stories/RadioGroup.stories.js +0 -144
  261. package/src/stories/Select.stories.js +0 -158
  262. package/src/stories/Toast.mdx +0 -123
  263. package/src/stories/Toast.stories.js +0 -126
@@ -1,42 +1,43 @@
1
1
  @use '@/assets/scss/unnnic' as *;
2
2
 
3
3
  @mixin input-base {
4
- background: $unnnic-color-white;
5
- border: $unnnic-border-width-thinner solid $unnnic-color-border-base;
4
+ background: $unnnic-color-neutral-white;
5
+ border: $unnnic-border-width-thinner solid $unnnic-color-neutral-clean;
6
6
  outline: none;
7
- border-radius: $unnnic-radius-2;
8
- color: $unnnic-color-fg-emphasized;
9
- caret-color: $unnnic-color-fg-muted;
10
- font: $unnnic-font-body;
7
+ border-radius: $unnnic-border-radius-sm;
8
+ color: $unnnic-color-neutral-darkest;
9
+ caret-color: $unnnic-color-neutral-clean;
10
+ font-weight: $unnnic-font-weight-regular;
11
+ font-family: $unnnic-font-family-secondary;
11
12
 
12
- &:focus,
13
- &.focus {
14
- transition: border-color 0.1s ease-in-out;
15
- border-color: $unnnic-color-border-active;
13
+ &:focus {
14
+ border-color: $unnnic-color-weni-600;
16
15
  }
17
16
 
18
17
  &::placeholder {
19
- color: $unnnic-color-fg-muted;
20
- opacity: 1;
21
- /* Firefox */
18
+ color: $unnnic-color-neutral-cleanest;
19
+ opacity: 1; /* Firefox */
22
20
  }
23
21
 
24
22
  &:disabled {
25
- border-color: $unnnic-color-border-muted;
26
- background-color: $unnnic-color-bg-muted;
23
+ border-color: $unnnic-color-neutral-cleanest;
24
+ background-color: $unnnic-color-neutral-lightest;
27
25
  cursor: not-allowed;
28
- color: $unnnic-color-fg-muted;
26
+ color: $unnnic-color-neutral-cleanest;
29
27
  }
30
28
  }
31
29
 
32
30
  @mixin input-sm-font {
33
- font: $unnnic-font-body;
31
+ font-size: $unnnic-font-size-body-md;
32
+ line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
34
33
  }
35
34
 
36
35
  @mixin input-md-font {
37
- font: $unnnic-font-body;
36
+ font-size: $unnnic-font-size-body-gt;
37
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
38
38
  }
39
39
 
40
40
  @mixin input-error {
41
- border-color: $unnnic-color-border-critical;
42
- }
41
+ border-color: $unnnic-color-aux-red-500;
42
+ color: $unnnic-color-aux-red-500;
43
+ }
@@ -1,56 +1,51 @@
1
1
  <template>
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
- >
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
+
12
17
  <TextInput
13
18
  v-bind="$attrs"
14
19
  v-model="val"
15
20
  class="unnnic-form-input"
16
- :forceActiveStatus="forceActiveStatus"
17
21
  :placeholder="placeholder"
18
22
  :iconLeft="iconLeft"
19
23
  :iconRight="iconRight"
20
- :type="errors.length > 0 && !disabled ? 'error' : type"
24
+ :type="type"
21
25
  :iconLeftClickable="iconLeftClickable"
22
26
  :iconRightClickable="iconRightClickable"
23
27
  :hasCloudyColor="hasCloudyColor"
24
28
  :size="size"
25
29
  :mask="mask"
26
30
  :nativeType="nativeType"
27
- :maxlength="maxlength"
28
- :disabled="disabled"
29
- :readonly="readonly"
30
- :showClear="showClear"
31
- @clear="$emit('clear')"
32
31
  />
33
32
 
34
- <template
35
- v-if="maxlength && showMaxlengthCounter"
36
- #rightMessage
33
+ <p
34
+ v-if="message"
35
+ class="unnnic-form__message"
37
36
  >
38
- {{ (val || '').length }} / {{ maxlength }}
39
- </template>
40
- </UnnnicFormElement>
37
+ {{ fullySanitize(message) }}
38
+ </p>
39
+ </div>
41
40
  </template>
42
41
 
43
42
  <script>
44
43
  import { fullySanitize } from '../../utils/sanitize';
45
44
  import TextInput from './TextInput.vue';
46
- import UnnnicFormElement from '../FormElement/FormElement.vue';
47
45
 
48
46
  export default {
49
47
  name: 'UnnnicInput',
50
- components: {
51
- TextInput,
52
- UnnnicFormElement,
53
- },
48
+ components: { TextInput },
54
49
  props: {
55
50
  placeholder: {
56
51
  type: String,
@@ -73,23 +68,19 @@ export default {
73
68
  },
74
69
  message: {
75
70
  type: String,
76
- default: '',
77
- },
78
- errors: {
79
- type: [String, Array],
80
- default: '',
71
+ default: null,
81
72
  },
82
73
  label: {
83
74
  type: String,
84
- default: '',
75
+ default: null,
85
76
  },
86
77
  iconLeft: {
87
78
  type: String,
88
- default: '',
79
+ default: null,
89
80
  },
90
81
  iconRight: {
91
82
  type: String,
92
- default: '',
83
+ default: null,
93
84
  },
94
85
  allowTogglePassword: {
95
86
  type: Boolean,
@@ -97,11 +88,11 @@ export default {
97
88
  },
98
89
  iconLeftClickable: {
99
90
  type: Boolean,
100
- default: false,
91
+ default: null,
101
92
  },
102
93
  iconRightClickable: {
103
94
  type: Boolean,
104
- default: false,
95
+ default: null,
105
96
  },
106
97
  hasCloudyColor: {
107
98
  type: Boolean,
@@ -115,50 +106,16 @@ export default {
115
106
  type: [String, Array],
116
107
  default: '',
117
108
  },
118
- tooltip: {
119
- type: String,
120
- default: '',
121
- },
122
- maxlength: {
123
- type: [Number, null],
124
- default: null,
125
- },
126
- showMaxlengthCounter: {
127
- type: Boolean,
128
- default: false,
129
- },
130
- disabled: {
131
- type: Boolean,
132
- default: false,
133
- },
134
- readonly: {
135
- type: Boolean,
136
- default: false,
137
- },
138
- forceActiveStatus: {
139
- type: Boolean,
140
- default: false,
141
- },
142
- showClear: {
143
- type: Boolean,
144
- default: false,
145
- },
146
109
  },
147
-
148
- emits: ['update:modelValue', 'clear'],
149
-
110
+ emits: ['update:modelValue'],
150
111
  data() {
151
112
  return {
152
113
  val: this.modelValue,
153
114
  };
154
115
  },
155
116
  computed: {
156
- computedError() {
157
- if (Array.isArray(this.errors)) {
158
- return this.errors.join(', ') || this.type === 'error';
159
- }
160
-
161
- return this.errors || this.type === 'error';
117
+ hasLabelSlot() {
118
+ return !!this.$slots.label;
162
119
  },
163
120
  },
164
121
  watch: {
@@ -179,9 +136,29 @@ export default {
179
136
  </script>
180
137
 
181
138
  <style lang="scss" scoped>
182
- * {
183
- margin: 0;
184
- padding: 0;
185
- box-sizing: border-box;
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
+ }
186
163
  }
187
164
  </style>
@@ -1,5 +1,11 @@
1
1
  <template>
2
- <div :class="['text-input', `size--${size}`]">
2
+ <div
3
+ :class="[
4
+ 'text-input',
5
+ `size--${size}`,
6
+ `text-input--icon-right-size-${iconRightSize}`,
7
+ ]"
8
+ >
3
9
  <BaseInput
4
10
  v-bind="attributes"
5
11
  ref="base-input"
@@ -12,10 +18,6 @@
12
18
  class="input-itself"
13
19
  :hasIconLeft="!!iconLeft"
14
20
  :hasIconRight="!!iconRight || allowTogglePassword"
15
- :hasClearIcon="showClear"
16
- :maxlength="maxlength"
17
- :readonly="readonly"
18
- :forceActiveStatus="forceActiveStatus"
19
21
  @focus="onFocus"
20
22
  @blur="onBlur"
21
23
  />
@@ -24,34 +26,24 @@
24
26
  v-if="iconLeft"
25
27
  :scheme="iconScheme"
26
28
  :icon="iconLeft"
27
- size="ant"
29
+ size="sm"
28
30
  :clickable="iconLeftClickable"
29
31
  :class="['icon-left', { clickable: iconLeftClickable }]"
30
32
  @click="onIconLeftClick"
31
33
  />
32
34
 
33
- <section class="icon-right-container">
34
- <UnnnicIcon
35
- v-if="showClear"
36
- class="icon-clear"
37
- :scheme="iconScheme"
38
- icon="close"
39
- size="ant"
40
- clickable
41
- @click.stop="onClearClick"
42
- />
43
-
44
- <UnnnicIcon
45
- v-if="iconRightSvg"
46
- :scheme="iconScheme"
47
- :icon="iconRightSvg"
48
- size="ant"
49
- :clickable="iconRightClickable || allowTogglePassword"
50
- class="icon-right"
51
- :class="{ clickable: iconRightClickable || allowTogglePassword }"
52
- @click="onIconRightClick"
53
- />
54
- </section>
35
+ <UnnnicIcon
36
+ v-if="iconRightSvg"
37
+ :scheme="iconScheme"
38
+ :icon="iconRightSvg"
39
+ :size="iconRightSize"
40
+ :clickable="iconRightClickable || allowTogglePassword"
41
+ :class="[
42
+ 'icon-right',
43
+ { clickable: iconRightClickable || allowTogglePassword },
44
+ ]"
45
+ @click="onIconRightClick"
46
+ />
55
47
  </div>
56
48
  </template>
57
49
 
@@ -100,36 +92,24 @@ export default {
100
92
  type: Boolean,
101
93
  default: null,
102
94
  },
95
+ iconRightSize: {
96
+ type: String,
97
+ default: 'sm',
98
+ },
103
99
  allowTogglePassword: {
104
100
  type: Boolean,
105
101
  default: null,
106
102
  },
103
+ hasCloudyColor: {
104
+ type: Boolean,
105
+ default: null,
106
+ },
107
107
  size: {
108
108
  type: String,
109
109
  default: 'md',
110
110
  },
111
- maxlength: {
112
- type: Number,
113
- default: null,
114
- },
115
- disabled: {
116
- type: Boolean,
117
- default: false,
118
- },
119
- readonly: {
120
- type: Boolean,
121
- default: false,
122
- },
123
- forceActiveStatus: {
124
- type: Boolean,
125
- default: false,
126
- },
127
- showClear: {
128
- type: Boolean,
129
- default: false,
130
- },
131
111
  },
132
- emits: ['icon-left-click', 'icon-right-click', 'clear'],
112
+ emits: ['icon-left-click', 'icon-right-click'],
133
113
  data() {
134
114
  return {
135
115
  isFocused: false,
@@ -138,7 +118,7 @@ export default {
138
118
  },
139
119
  computed: {
140
120
  isDisabled() {
141
- return this.$attrs.disabled || this.disabled;
121
+ return this.$attrs.disabled;
142
122
  },
143
123
 
144
124
  iconRightSvg() {
@@ -150,15 +130,23 @@ export default {
150
130
  },
151
131
 
152
132
  iconScheme() {
133
+ if (this.type === 'error') {
134
+ return 'aux-red-500';
135
+ }
136
+
153
137
  if (this.isDisabled) {
154
- return 'fg-muted';
138
+ return 'neutral-cleanest';
139
+ }
140
+
141
+ if (this.modelValue || this.isFocused) {
142
+ return 'neutral-dark';
155
143
  }
156
144
 
157
- if (this.forceActiveStatus) {
158
- return 'color-gray-700';
145
+ if (this.hasCloudyColor) {
146
+ return 'neutral-cloudy';
159
147
  }
160
148
 
161
- return 'fg-base';
149
+ return 'neutral-cloudy';
162
150
  },
163
151
 
164
152
  attributes() {
@@ -183,10 +171,6 @@ export default {
183
171
  if (this.iconLeftClickable) this.$emit('icon-left-click');
184
172
  },
185
173
 
186
- onClearClick() {
187
- this.$emit('clear');
188
- },
189
-
190
174
  onIconRightClick() {
191
175
  if (this.attributes.disabled) return;
192
176
  if (this.allowTogglePassword) this.showPassword = !this.showPassword;
@@ -199,38 +183,42 @@ export default {
199
183
  <style lang="scss" scoped>
200
184
  @use '@/assets/scss/unnnic' as *;
201
185
 
202
- .text-input {
203
- position: relative;
204
- }
205
-
206
186
  .icon {
207
- &-left {
208
- position: absolute;
209
- top: 50%;
210
- transform: translateY(-50%);
211
- left: $unnnic-space-4;
212
-
187
+ &-left,
188
+ &-right {
213
189
  &:not(.clickable) {
214
190
  pointer-events: none;
215
191
  }
216
192
  }
217
193
 
218
- &-right-container {
194
+ &-left {
219
195
  position: absolute;
220
- top: 50%;
221
- transform: translateY(-50%);
222
- right: $unnnic-space-4;
196
+ top: $unnnic-spacing-ant + 0.1875 * $unnnic-font-size;
197
+ left: $unnnic-inline-sm - $unnnic-border-width-thinner;
198
+ }
223
199
 
224
- display: flex;
225
- align-items: center;
226
- gap: $unnnic-space-2;
200
+ &-right {
201
+ 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;
227
208
 
228
- .icon-clear {
229
- cursor: pointer;
230
- }
231
- .icon-right:not(.clickable) {
232
- pointer-events: none;
209
+ &.size--sm {
210
+ .icon-left,
211
+ .icon-right {
212
+ top: $unnnic-spacing-xs + 0.125 * $unnnic-font-size;
233
213
  }
234
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;
222
+ }
235
223
  }
236
224
  </style>
@@ -40,21 +40,29 @@ describe('Input.vue', () => {
40
40
  expect(wrapper.exists()).toBe(true);
41
41
  });
42
42
 
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);
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);
52
59
  });
53
60
 
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');
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');
58
66
  });
59
67
 
60
68
  test('renders TextInput component', () => {
@@ -88,6 +96,18 @@ describe('Input.vue', () => {
88
96
  expect(wrapper.vm.val).toBe('new value');
89
97
  });
90
98
 
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
+
91
111
  test('correctly mounts with initial modelValue', async () => {
92
112
  wrapper = mount(Input, {
93
113
  props: {
@@ -19,6 +19,7 @@ describe('TextInput.vue', () => {
19
19
  iconLeftClickable: true,
20
20
  iconRightClickable: true,
21
21
  allowTogglePassword: false,
22
+ hasCloudyColor: false,
22
23
  size: 'md',
23
24
  },
24
25
  global: {
@@ -73,21 +74,22 @@ describe('TextInput.vue', () => {
73
74
 
74
75
  test('computes the correct iconScheme based on various states', async () => {
75
76
  await wrapper.setProps({ type: 'error' });
76
- expect(wrapper.vm.iconScheme).toBe('fg-base');
77
+ expect(wrapper.vm.iconScheme).toBe('aux-red-500');
77
78
 
78
79
  await wrapper.setProps({ type: 'normal' });
79
80
  await wrapper.setData({ isDisabled: true });
80
- expect(wrapper.vm.iconScheme).toBe('fg-base');
81
+ expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
81
82
 
82
83
  await wrapper.setData({ isDisabled: false });
83
84
  await wrapper.setProps({ modelValue: 'text' });
84
- expect(wrapper.vm.iconScheme).toBe('fg-base');
85
+ expect(wrapper.vm.iconScheme).toBe('neutral-dark');
85
86
 
86
87
  await wrapper.setData({ isFocused: true });
87
- expect(wrapper.vm.iconScheme).toBe('fg-base');
88
+ expect(wrapper.vm.iconScheme).toBe('neutral-dark');
88
89
 
89
- await wrapper.setProps({ disabled: true });
90
- expect(wrapper.vm.iconScheme).toBe('fg-muted');
90
+ await wrapper.setProps({ hasCloudyColor: true, modelValue: '' });
91
+ await wrapper.setData({ isFocused: false });
92
+ expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
91
93
  });
92
94
 
93
95
  test('attributes computed property returns combined attributes and props', () => {
@@ -3,7 +3,7 @@
3
3
  exports[`Input.vue > matches the snapshot 1`] = `
4
4
  "<div data-v-d890ad85="" class="unnnic-form md">
5
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="material-symbols-rounded unnnic-icon-scheme--neutral-cloudy 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="material-symbols-rounded unnnic-icon-scheme--neutral-cloudy unnnic-icon-size--sm unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span></div>
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
7
  <p data-v-d890ad85="" class="unnnic-form__message">Error message</p>
8
8
  </div>"
9
9
  `;
@@ -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="material-symbols-rounded unnnic-icon-scheme--neutral-cloudy 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="material-symbols-rounded unnnic-icon-scheme--neutral-cloudy 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 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>"`;