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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +18 -117
  4. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  5. package/dist/components/Alert/Version1dot1.vue.d.ts +2 -38
  6. package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
  7. package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
  8. package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
  9. package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
  10. package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
  11. package/dist/components/Banner/Banner.vue.d.ts +1 -1
  12. package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
  13. package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
  14. package/dist/components/Button/Button.vue.d.ts +1 -1
  15. package/dist/components/Button/Button.vue.d.ts.map +1 -1
  16. package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
  17. package/dist/components/Button/types.d.ts +1 -1
  18. package/dist/components/Button/types.d.ts.map +1 -1
  19. package/dist/components/Card/AccountCard.vue.d.ts +5 -5
  20. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  21. package/dist/components/Card/Card.vue.d.ts +27 -27
  22. package/dist/components/Card/CardCompany.vue.d.ts +5 -5
  23. package/dist/components/Card/CardData.vue.d.ts +1 -1
  24. package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
  25. package/dist/components/Card/ContentCard.vue.d.ts +3 -3
  26. package/dist/components/Card/DashCard.vue.d.ts +5 -5
  27. package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
  28. package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
  29. package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
  30. package/dist/components/Card/StatusCard.vue.d.ts +2 -2
  31. package/dist/components/Card/TitleCard.vue.d.ts +3 -3
  32. package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
  33. package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
  34. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  35. package/dist/components/Carousel/Carousel.vue.d.ts +7 -7
  36. package/dist/components/Carousel/TagCarousel.vue.d.ts +6 -6
  37. package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
  38. package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
  39. package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
  40. package/dist/components/ChatsContact/ChatsContact.vue.d.ts +27 -34
  41. package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
  42. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
  43. package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
  44. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
  45. package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
  46. package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
  47. package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
  48. package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
  49. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  50. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
  51. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
  52. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  53. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  54. package/dist/components/DataTable/index.vue.d.ts +1 -1
  55. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  56. package/dist/components/DateFilter/DateFilter.vue.d.ts +253 -43
  57. package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
  58. package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
  59. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  60. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  61. package/dist/components/Flag.vue.d.ts +2 -2
  62. package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
  63. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  64. package/dist/components/Icon.vue.d.ts +1 -1
  65. package/dist/components/Icon.vue.d.ts.map +1 -1
  66. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  67. package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
  68. package/dist/components/Input/BaseInput.vue.d.ts +33 -2
  69. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  70. package/dist/components/Input/Input.vue.d.ts +253 -43
  71. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  72. package/dist/components/Input/TextInput.vue.d.ts +86 -26
  73. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  74. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +259 -49
  75. package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
  76. package/dist/components/Label/Label.vue.d.ts +9 -15
  77. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  78. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  79. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +199 -34
  80. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  81. package/dist/components/ModalNext/ModalNext.vue.d.ts +258 -48
  82. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +8 -8
  83. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  84. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +20 -14
  85. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  86. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  87. package/dist/components/Radio/Radio.vue.d.ts +8 -6
  88. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  89. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +115 -62
  90. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +5 -5
  91. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
  92. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  93. package/dist/components/SelectTime/index.vue.d.ts +87 -27
  94. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +2 -2
  95. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  96. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  97. package/dist/components/Switch/Switch.vue.d.ts +55 -21
  98. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  99. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  100. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  101. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  102. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  103. package/dist/components/Tag/BrandTag.vue.d.ts +1 -1
  104. package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
  105. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  106. package/dist/components/Tag/Tag.vue.d.ts +5 -5
  107. package/dist/components/TextArea/TextArea.vue.d.ts +66 -30
  108. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  109. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  110. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  111. package/dist/components/Toast/ToastManager.d.ts +14 -0
  112. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  113. package/dist/components/Toast/types.d.ts +35 -0
  114. package/dist/components/Toast/types.d.ts.map +1 -0
  115. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  116. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  117. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  118. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  119. package/dist/components/index.d.ts +4057 -1342
  120. package/dist/components/index.d.ts.map +1 -1
  121. package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
  122. package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
  123. package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
  124. package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
  125. package/dist/components/ui/dialog/DialogContent.vue.d.ts +40 -0
  126. package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
  127. package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
  128. package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
  129. package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
  130. package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
  131. package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
  132. package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
  133. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
  134. package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
  135. package/dist/components/ui/dialog/index.d.ts +8 -0
  136. package/dist/components/ui/dialog/index.d.ts.map +1 -0
  137. package/dist/components/ui/popover/Popover.vue.d.ts +23 -0
  138. package/dist/components/ui/popover/Popover.vue.d.ts.map +1 -0
  139. package/dist/components/ui/popover/PopoverContent.vue.d.ts +43 -0
  140. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -0
  141. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +19 -0
  142. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +1 -0
  143. package/dist/components/ui/popover/index.d.ts +5 -0
  144. package/dist/components/ui/popover/index.d.ts.map +1 -0
  145. package/dist/{es-92fbe460.mjs → es-3d0df246.mjs} +1 -1
  146. package/dist/{index-0da47957.mjs → index-8cf13f7a.mjs} +19106 -10952
  147. package/dist/locales/en.json.d.ts +2 -1
  148. package/dist/locales/es.json.d.ts +2 -1
  149. package/dist/locales/pt_br.json.d.ts +2 -1
  150. package/dist/{pt-br-c29b6c9a.mjs → pt-br-b04d6fba.mjs} +1 -1
  151. package/dist/style.css +1 -1
  152. package/dist/unnnic.mjs +195 -172
  153. package/dist/unnnic.umd.js +56 -50
  154. package/dist/utils/call.d.ts +2 -1
  155. package/dist/utils/call.d.ts.map +1 -1
  156. package/package.json +4 -2
  157. package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
  158. package/src/assets/icons/checkbox-checked.svg +3 -0
  159. package/src/assets/icons/checkbox-less-disabled.svg +3 -0
  160. package/src/assets/icons/checkbox-less.svg +3 -0
  161. package/src/assets/icons/radio-checked.svg +3 -0
  162. package/src/assets/icons/switch-checked-disabled.svg +3 -0
  163. package/src/assets/icons/switch-checked.svg +3 -0
  164. package/src/assets/scss/tailwind.scss +8 -0
  165. package/src/components/Alert/Alert.vue +26 -135
  166. package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
  167. package/src/components/Alert/Version1dot1.vue +0 -36
  168. package/src/components/Alert/__tests__/Alert.spec.js +2 -45
  169. package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
  170. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  171. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  172. package/src/components/Button/Button.vue +72 -117
  173. package/src/components/Button/types.ts +0 -1
  174. package/src/components/Checkbox/Checkbox.vue +98 -64
  175. package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
  176. package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
  177. package/src/components/FormElement/FormElement.vue +63 -93
  178. package/src/components/Icon.vue +26 -1
  179. package/src/components/Input/BaseInput.vue +33 -14
  180. package/src/components/Input/Input.scss +19 -21
  181. package/src/components/Input/Input.vue +77 -56
  182. package/src/components/Input/TextInput.vue +80 -68
  183. package/src/components/Input/__test__/TextInput.spec.js +6 -8
  184. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
  185. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
  186. package/src/components/Label/Label.vue +52 -21
  187. package/src/components/Label/__tests__/Label.spec.js +1 -1
  188. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  189. package/src/components/ModalDialog/ModalDialog.vue +60 -146
  190. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
  191. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  192. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  193. package/src/components/Popover/index.vue +146 -0
  194. package/src/components/Radio/Radio.vue +80 -67
  195. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  196. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  197. package/src/components/RadioGroup/RadioGroup.vue +142 -0
  198. package/src/components/Select/SelectOption.vue +65 -0
  199. package/src/components/Select/__tests__/Select.spec.js +412 -0
  200. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  201. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  202. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  203. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  204. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  205. package/src/components/Select/index.vue +245 -0
  206. package/src/components/SelectSmart/SelectSmart.vue +4 -3
  207. package/src/components/Switch/Switch.vue +123 -96
  208. package/src/components/Switch/__tests__/Switch.spec.js +8 -75
  209. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
  210. package/src/components/Tab/Tab.vue +37 -23
  211. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  212. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  213. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  214. package/src/components/TextArea/TextArea.vue +34 -11
  215. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
  216. package/src/components/Toast/Toast.vue +246 -0
  217. package/src/components/Toast/ToastManager.ts +110 -0
  218. package/src/components/Toast/__tests__/Toast.spec.js +284 -0
  219. package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
  220. package/src/components/Toast/types.ts +57 -0
  221. package/src/components/index.ts +58 -9
  222. package/src/components/ui/dialog/Dialog.vue +15 -0
  223. package/src/components/ui/dialog/DialogClose.vue +25 -0
  224. package/src/components/ui/dialog/DialogContent.vue +114 -0
  225. package/src/components/ui/dialog/DialogFooter.vue +46 -0
  226. package/src/components/ui/dialog/DialogHeader.vue +78 -0
  227. package/src/components/ui/dialog/DialogTitle.vue +34 -0
  228. package/src/components/ui/dialog/DialogTrigger.vue +12 -0
  229. package/src/components/ui/dialog/index.ts +7 -0
  230. package/src/components/ui/popover/Popover.vue +19 -0
  231. package/src/components/ui/popover/PopoverContent.vue +98 -0
  232. package/src/components/ui/popover/PopoverTrigger.vue +23 -0
  233. package/src/components/ui/popover/index.ts +4 -0
  234. package/src/locales/en.json +2 -1
  235. package/src/locales/es.json +2 -1
  236. package/src/locales/pt_br.json +2 -1
  237. package/src/stories/Alert.stories.js +6 -67
  238. package/src/stories/Button.stories.js +29 -39
  239. package/src/stories/Checkbox.stories.js +11 -4
  240. package/src/stories/CheckboxGroup.stories.js +105 -0
  241. package/src/stories/Dialog.stories.js +832 -0
  242. package/src/stories/Icon.stories.js +24 -15
  243. package/src/stories/Input.stories.js +71 -76
  244. package/src/stories/Label.stories.js +7 -0
  245. package/src/stories/ModalDialog.mdx +3 -0
  246. package/src/stories/ModalDialog.stories.js +1 -1
  247. package/src/stories/Popover.stories.js +306 -0
  248. package/src/stories/RadioGroup.stories.js +144 -0
  249. package/src/stories/Select.stories.js +158 -0
  250. package/src/stories/Switch.stories.js +10 -5
  251. package/src/stories/Tab.stories.js +11 -4
  252. package/src/stories/TextArea.stories.js +13 -2
  253. package/src/stories/Toast.mdx +123 -0
  254. package/src/stories/Toast.stories.js +126 -0
  255. package/src/types/scheme-colors.d.ts +1 -0
  256. package/src/utils/call.js +46 -18
  257. package/src/components/Alert/AlertBanner.vue +0 -182
  258. package/src/components/Alert/AlertCaller.vue +0 -49
  259. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  260. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
@@ -1,51 +1,54 @@
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
+ >
17
10
  <TextInput
18
11
  v-bind="$attrs"
19
12
  v-model="val"
20
13
  class="unnnic-form-input"
14
+ :forceActiveStatus="forceActiveStatus"
21
15
  :placeholder="placeholder"
22
16
  :iconLeft="iconLeft"
23
17
  :iconRight="iconRight"
24
- :type="type"
18
+ :type="errors.length > 0 && !disabled ? 'error' : type"
25
19
  :iconLeftClickable="iconLeftClickable"
26
20
  :iconRightClickable="iconRightClickable"
27
21
  :hasCloudyColor="hasCloudyColor"
28
22
  :size="size"
29
23
  :mask="mask"
30
24
  :nativeType="nativeType"
25
+ :maxlength="maxlength"
26
+ :disabled="disabled"
27
+ :readonly="readonly"
28
+ :showClear="showClear"
29
+ @clear="$emit('clear')"
31
30
  />
32
31
 
33
- <p
34
- v-if="message"
35
- class="unnnic-form__message"
32
+ <template
33
+ v-if="maxlength && showMaxlengthCounter"
34
+ #rightMessage
36
35
  >
37
- {{ fullySanitize(message) }}
38
- </p>
39
- </div>
36
+ {{ (val || '').length }} / {{ maxlength }}
37
+ </template>
38
+ </UnnnicFormElement>
40
39
  </template>
41
40
 
42
41
  <script>
43
42
  import { fullySanitize } from '../../utils/sanitize';
44
43
  import TextInput from './TextInput.vue';
44
+ import UnnnicFormElement from '../FormElement/FormElement.vue';
45
45
 
46
46
  export default {
47
47
  name: 'UnnnicInput',
48
- components: { TextInput },
48
+ components: {
49
+ TextInput,
50
+ UnnnicFormElement,
51
+ },
49
52
  props: {
50
53
  placeholder: {
51
54
  type: String,
@@ -68,19 +71,23 @@ export default {
68
71
  },
69
72
  message: {
70
73
  type: String,
71
- default: null,
74
+ default: '',
75
+ },
76
+ errors: {
77
+ type: [String, Array],
78
+ default: '',
72
79
  },
73
80
  label: {
74
81
  type: String,
75
- default: null,
82
+ default: '',
76
83
  },
77
84
  iconLeft: {
78
85
  type: String,
79
- default: null,
86
+ default: '',
80
87
  },
81
88
  iconRight: {
82
89
  type: String,
83
- default: null,
90
+ default: '',
84
91
  },
85
92
  allowTogglePassword: {
86
93
  type: Boolean,
@@ -88,11 +95,11 @@ export default {
88
95
  },
89
96
  iconLeftClickable: {
90
97
  type: Boolean,
91
- default: null,
98
+ default: false,
92
99
  },
93
100
  iconRightClickable: {
94
101
  type: Boolean,
95
- default: null,
102
+ default: false,
96
103
  },
97
104
  hasCloudyColor: {
98
105
  type: Boolean,
@@ -106,16 +113,50 @@ export default {
106
113
  type: [String, Array],
107
114
  default: '',
108
115
  },
116
+ tooltip: {
117
+ type: String,
118
+ default: '',
119
+ },
120
+ maxlength: {
121
+ type: [Number, null],
122
+ default: null,
123
+ },
124
+ showMaxlengthCounter: {
125
+ type: Boolean,
126
+ default: false,
127
+ },
128
+ disabled: {
129
+ type: Boolean,
130
+ default: false,
131
+ },
132
+ readonly: {
133
+ type: Boolean,
134
+ default: false,
135
+ },
136
+ forceActiveStatus: {
137
+ type: Boolean,
138
+ default: false,
139
+ },
140
+ showClear: {
141
+ type: Boolean,
142
+ default: false,
143
+ },
109
144
  },
110
- emits: ['update:modelValue'],
145
+
146
+ emits: ['update:modelValue', 'clear'],
147
+
111
148
  data() {
112
149
  return {
113
150
  val: this.modelValue,
114
151
  };
115
152
  },
116
153
  computed: {
117
- hasLabelSlot() {
118
- return !!this.$slots.label;
154
+ computedError() {
155
+ if (Array.isArray(this.errors)) {
156
+ return this.errors.join(', ') || this.type === 'error';
157
+ }
158
+
159
+ return this.errors || this.type === 'error';
119
160
  },
120
161
  },
121
162
  watch: {
@@ -136,29 +177,9 @@ export default {
136
177
  </script>
137
178
 
138
179
  <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
- }
180
+ * {
181
+ margin: 0;
182
+ padding: 0;
183
+ box-sizing: border-box;
163
184
  }
164
185
  </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,10 @@
18
12
  class="input-itself"
19
13
  :hasIconLeft="!!iconLeft"
20
14
  :hasIconRight="!!iconRight || allowTogglePassword"
15
+ :hasClearIcon="showClear"
16
+ :maxlength="maxlength"
17
+ :readonly="readonly"
18
+ :forceActiveStatus="forceActiveStatus"
21
19
  @focus="onFocus"
22
20
  @blur="onBlur"
23
21
  />
@@ -26,24 +24,34 @@
26
24
  v-if="iconLeft"
27
25
  :scheme="iconScheme"
28
26
  :icon="iconLeft"
29
- size="sm"
27
+ size="ant"
30
28
  :clickable="iconLeftClickable"
31
29
  :class="['icon-left', { clickable: iconLeftClickable }]"
32
30
  @click="onIconLeftClick"
33
31
  />
34
32
 
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
- />
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>
47
55
  </div>
48
56
  </template>
49
57
 
@@ -92,24 +100,36 @@ export default {
92
100
  type: Boolean,
93
101
  default: null,
94
102
  },
95
- iconRightSize: {
96
- type: String,
97
- default: 'sm',
98
- },
99
103
  allowTogglePassword: {
100
104
  type: Boolean,
101
105
  default: null,
102
106
  },
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
+ },
111
131
  },
112
- emits: ['icon-left-click', 'icon-right-click'],
132
+ emits: ['icon-left-click', 'icon-right-click', 'clear'],
113
133
  data() {
114
134
  return {
115
135
  isFocused: false,
@@ -118,7 +138,7 @@ export default {
118
138
  },
119
139
  computed: {
120
140
  isDisabled() {
121
- return this.$attrs.disabled;
141
+ return this.$attrs.disabled || this.disabled;
122
142
  },
123
143
 
124
144
  iconRightSvg() {
@@ -130,23 +150,15 @@ export default {
130
150
  },
131
151
 
132
152
  iconScheme() {
133
- if (this.type === 'error') {
134
- return 'aux-red-500';
135
- }
136
-
137
153
  if (this.isDisabled) {
138
- return 'neutral-cleanest';
139
- }
140
-
141
- if (this.modelValue || this.isFocused) {
142
- return 'neutral-dark';
154
+ return 'fg-muted';
143
155
  }
144
156
 
145
- if (this.hasCloudyColor) {
146
- return 'neutral-cloudy';
157
+ if (this.forceActiveStatus) {
158
+ return 'color-gray-700';
147
159
  }
148
160
 
149
- return 'neutral-cloudy';
161
+ return 'fg-base';
150
162
  },
151
163
 
152
164
  attributes() {
@@ -171,6 +183,10 @@ export default {
171
183
  if (this.iconLeftClickable) this.$emit('icon-left-click');
172
184
  },
173
185
 
186
+ onClearClick() {
187
+ this.$emit('clear');
188
+ },
189
+
174
190
  onIconRightClick() {
175
191
  if (this.attributes.disabled) return;
176
192
  if (this.allowTogglePassword) this.showPassword = !this.showPassword;
@@ -183,42 +199,38 @@ export default {
183
199
  <style lang="scss" scoped>
184
200
  @use '@/assets/scss/unnnic' as *;
185
201
 
202
+ .text-input {
203
+ position: relative;
204
+ }
205
+
186
206
  .icon {
187
- &-left,
188
- &-right {
207
+ &-left {
208
+ position: absolute;
209
+ top: 50%;
210
+ transform: translateY(-50%);
211
+ left: $unnnic-space-4;
212
+
189
213
  &:not(.clickable) {
190
214
  pointer-events: none;
191
215
  }
192
216
  }
193
217
 
194
- &-left {
218
+ &-right-container {
195
219
  position: absolute;
196
- top: $unnnic-spacing-ant + 0.1875 * $unnnic-font-size;
197
- left: $unnnic-inline-sm - $unnnic-border-width-thinner;
198
- }
220
+ top: 50%;
221
+ transform: translateY(-50%);
222
+ right: $unnnic-space-4;
199
223
 
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;
224
+ display: flex;
225
+ align-items: center;
226
+ gap: $unnnic-space-2;
208
227
 
209
- &.size--sm {
210
- .icon-left,
211
- .icon-right {
212
- top: $unnnic-spacing-xs + 0.125 * $unnnic-font-size;
228
+ .icon-clear {
229
+ cursor: pointer;
230
+ }
231
+ .icon-right:not(.clickable) {
232
+ pointer-events: none;
213
233
  }
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
234
  }
223
235
  }
224
236
  </style>
@@ -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">
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>"`;