@weni/unnnic-system 3.3.0 → 3.3.1-alpha.3

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 (206) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +18 -119
  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 +2 -2
  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 +2 -2
  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 +3 -3
  20. package/dist/components/Card/BlankCard.vue.d.ts +1 -1
  21. package/dist/components/Card/Card.vue.d.ts +21 -21
  22. package/dist/components/Card/CardCompany.vue.d.ts +8 -8
  23. package/dist/components/Card/CardData.vue.d.ts +1 -1
  24. package/dist/components/Card/CardStatusesContainer.vue.d.ts +4 -4
  25. package/dist/components/Card/ContentCard.vue.d.ts +2 -2
  26. package/dist/components/Card/DashCard.vue.d.ts +4 -4
  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 +2 -2
  32. package/dist/components/CardImage/CardImage.vue.d.ts +8 -8
  33. package/dist/components/CardInformation/CardInformation.vue.d.ts +4 -4
  34. package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
  35. package/dist/components/Carousel/Carousel.vue.d.ts +11 -11
  36. package/dist/components/Carousel/TagCarousel.vue.d.ts +9 -9
  37. package/dist/components/ChartBar/ChartBar.vue.d.ts +8 -8
  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 +15 -15
  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 +3 -3
  49. package/dist/components/Comment/Comment.vue.d.ts +1 -1
  50. package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
  51. package/dist/components/DataTable/index.vue.d.ts +8 -1
  52. package/dist/components/DataTable/index.vue.d.ts.map +1 -1
  53. package/dist/components/DateFilter/DateFilter.vue.d.ts +176 -29
  54. package/dist/components/DatePicker/DatePicker.vue.d.ts +8 -8
  55. package/dist/components/Drawer/Drawer.vue.d.ts +7 -7
  56. package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
  57. package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
  58. package/dist/components/Flag.vue.d.ts +2 -2
  59. package/dist/components/FormElement/FormElement.vue.d.ts +38 -32
  60. package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
  61. package/dist/components/Icon.vue.d.ts +1 -1
  62. package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
  63. package/dist/components/ImportCard/ImportCard.vue.d.ts +7 -7
  64. package/dist/components/Input/BaseInput.vue.d.ts +32 -1
  65. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  66. package/dist/components/Input/Input.vue.d.ts +176 -29
  67. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  68. package/dist/components/Input/TextInput.vue.d.ts +83 -14
  69. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  70. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +186 -39
  71. package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
  72. package/dist/components/Label/Label.vue.d.ts +9 -15
  73. package/dist/components/Label/Label.vue.d.ts.map +1 -1
  74. package/dist/components/Modal/Modal.vue.d.ts +2 -2
  75. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +9 -9
  76. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  77. package/dist/components/ModalNext/ModalNext.vue.d.ts +184 -37
  78. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +14 -14
  79. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  80. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +20 -14
  81. package/dist/components/Pagination/Pagination.vue.d.ts +6 -6
  82. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  83. package/dist/components/Radio/Radio.vue.d.ts +8 -6
  84. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  85. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +97 -28
  86. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +8 -8
  87. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +4 -4
  88. package/dist/components/SelectTime/index.vue.d.ts +83 -14
  89. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
  90. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  91. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  92. package/dist/components/Switch/Switch.vue.d.ts +2 -2
  93. package/dist/components/Tab/Tab.vue.d.ts +13 -2
  94. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  95. package/dist/components/TableNext/TablePagination.vue.d.ts +6 -6
  96. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  97. package/dist/components/Tag/BrandTag.vue.d.ts +2 -2
  98. package/dist/components/Tag/DefaultTag.vue.d.ts +2 -2
  99. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  100. package/dist/components/Tag/Tag.vue.d.ts +8 -8
  101. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +9 -0
  102. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +1 -0
  103. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +15 -0
  104. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +1 -0
  105. package/dist/components/TextArea/TextArea.vue.d.ts +38 -32
  106. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  107. package/dist/components/Toast/Toast.vue.d.ts +16 -0
  108. package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
  109. package/dist/components/Toast/ToastManager.d.ts +14 -0
  110. package/dist/components/Toast/ToastManager.d.ts.map +1 -0
  111. package/dist/components/Toast/types.d.ts +35 -0
  112. package/dist/components/Toast/types.d.ts.map +1 -0
  113. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  114. package/dist/components/Tour/Tour.vue.d.ts +6 -6
  115. package/dist/components/Tour/TourPopover.vue.d.ts +6 -6
  116. package/dist/components/UploadArea/UploadArea.vue.d.ts +7 -7
  117. package/dist/components/index.d.ts +2136 -1114
  118. package/dist/components/index.d.ts.map +1 -1
  119. package/dist/{es-db7a2f44.mjs → es-94ab560e.mjs} +1 -1
  120. package/dist/{index-08caf833.mjs → index-5caf403e.mjs} +8790 -8436
  121. package/dist/locales/en.json.d.ts +2 -1
  122. package/dist/locales/es.json.d.ts +2 -1
  123. package/dist/locales/pt_br.json.d.ts +2 -1
  124. package/dist/{pt-br-88538a51.mjs → pt-br-3002df05.mjs} +1 -1
  125. package/dist/style.css +1 -1
  126. package/dist/unnnic.mjs +126 -120
  127. package/dist/unnnic.umd.js +42 -41
  128. package/dist/utils/call.d.ts +2 -1
  129. package/dist/utils/call.d.ts.map +1 -1
  130. package/package.json +2 -2
  131. package/src/assets/icons/radio-checked.svg +3 -0
  132. package/src/assets/img/previews/doc-preview.png +0 -0
  133. package/src/assets/img/previews/image-preview.png +0 -0
  134. package/src/assets/img/previews/video-preview.png +0 -0
  135. package/src/assets/scss/scheme-colors.scss +115 -111
  136. package/src/assets/tokens/colors.json +2 -2
  137. package/src/components/Alert/Alert.vue +26 -135
  138. package/src/components/Alert/Version1dot1.vue +0 -36
  139. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
  140. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  141. package/src/components/Button/Button.vue +60 -108
  142. package/src/components/Button/types.ts +0 -1
  143. package/src/components/DataTable/index.vue +25 -10
  144. package/src/components/FormElement/FormElement.vue +51 -91
  145. package/src/components/Input/BaseInput.vue +31 -14
  146. package/src/components/Input/Input.scss +19 -21
  147. package/src/components/Input/Input.vue +94 -30
  148. package/src/components/Input/TextInput.vue +82 -58
  149. package/src/components/Input/__test__/TextInput.spec.js +5 -5
  150. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +16 -3
  151. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +7 -1
  152. package/src/components/Label/Label.vue +52 -21
  153. package/src/components/Label/__tests__/Label.spec.js +1 -1
  154. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  155. package/src/components/ModalDialog/ModalDialog.vue +1 -0
  156. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
  157. package/src/components/Popover/__tests__/Popover.spec.js +147 -0
  158. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  159. package/src/components/Popover/index.vue +146 -0
  160. package/src/components/Radio/Radio.vue +80 -67
  161. package/src/components/Radio/__test__/Radio.spec.js +14 -20
  162. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  163. package/src/components/RadioGroup/RadioGroup.vue +110 -0
  164. package/src/components/Select/SelectOption.vue +65 -0
  165. package/src/components/Select/__tests__/Select.spec.js +412 -0
  166. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  167. package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
  168. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
  169. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  170. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  171. package/src/components/Select/index.vue +245 -0
  172. package/src/components/Tab/Tab.vue +37 -23
  173. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  174. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  175. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  176. package/src/components/TemplatePreview/TemplatePreview.vue +252 -0
  177. package/src/components/TemplatePreview/TemplatePreviewModal.vue +51 -0
  178. package/src/components/TemplatePreview/types.d.ts +16 -0
  179. package/src/components/TextArea/TextArea.vue +13 -9
  180. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +7 -2
  181. package/src/components/Toast/Toast.vue +236 -0
  182. package/src/components/Toast/ToastManager.ts +110 -0
  183. package/src/components/Toast/types.ts +57 -0
  184. package/src/components/index.ts +18 -4
  185. package/src/locales/en.json +2 -1
  186. package/src/locales/es.json +2 -1
  187. package/src/locales/pt_br.json +2 -1
  188. package/src/stories/Alert.stories.js +6 -67
  189. package/src/stories/Button.stories.js +2 -17
  190. package/src/stories/DataTable.stories.js +60 -0
  191. package/src/stories/Input.stories.js +22 -3
  192. package/src/stories/Label.stories.js +7 -0
  193. package/src/stories/Popover.stories.js +39 -0
  194. package/src/stories/RadioGroup.stories.js +139 -0
  195. package/src/stories/Select.stories.js +158 -0
  196. package/src/stories/Tab.stories.js +11 -4
  197. package/src/stories/TemplatePreview.stories.js +94 -0
  198. package/src/stories/TemplatePreviewModal.stories.js +110 -0
  199. package/src/stories/Toast.mdx +123 -0
  200. package/src/stories/Toast.stories.js +126 -0
  201. package/src/types/scheme-colors.d.ts +120 -14
  202. package/src/utils/call.js +46 -18
  203. package/src/components/Alert/AlertBanner.vue +0 -182
  204. package/src/components/Alert/AlertCaller.vue +0 -49
  205. package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
  206. package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
@@ -4,16 +4,18 @@
4
4
  v-mask="mask"
5
5
  v-bind="attributes"
6
6
  :value="fullySanitize(modelValue)"
7
- :class="classes"
7
+ :class="[classes, { focus: forceActiveStatus }]"
8
8
  :type="nativeType"
9
+ :readonly="readonly"
9
10
  />
10
-
11
11
  <input
12
12
  v-else
13
13
  v-bind="attributes"
14
14
  :value="fullySanitize(modelValue)"
15
- :class="classes"
15
+ :class="[classes, { focus: forceActiveStatus }]"
16
16
  :type="nativeType"
17
+ :maxlength="maxlength"
18
+ :readonly="readonly"
17
19
  />
18
20
  </template>
19
21
 
@@ -49,6 +51,19 @@ export default {
49
51
  },
50
52
  hasIconLeft: Boolean,
51
53
  hasIconRight: Boolean,
54
+ hasClearIcon: Boolean,
55
+ maxlength: {
56
+ type: Number,
57
+ default: null,
58
+ },
59
+ readonly: {
60
+ type: Boolean,
61
+ default: false,
62
+ },
63
+ forceActiveStatus: {
64
+ type: Boolean,
65
+ default: false,
66
+ },
52
67
  },
53
68
  emits: ['update:modelValue'],
54
69
  data() {
@@ -73,6 +88,7 @@ export default {
73
88
  {
74
89
  'input--has-icon-left': this.hasIconLeft,
75
90
  'input--has-icon-right': this.hasIconRight,
91
+ 'input--has-clear-icon': this.hasClearIcon,
76
92
  },
77
93
  ];
78
94
  },
@@ -96,27 +112,28 @@ export default {
96
112
  &.size {
97
113
  &-md {
98
114
  @include input-md-font;
99
-
100
- padding: ($unnnic-spacing-ant - $unnnic-border-width-thinner)
101
- ($unnnic-spacing-sm - $unnnic-border-width-thinner);
115
+ padding: $unnnic-space-3 $unnnic-space-4;
102
116
  }
103
117
 
104
118
  &-sm {
105
119
  @include input-sm-font;
106
-
107
- padding: $unnnic-spacing-xs
108
- ($unnnic-spacing-sm - $unnnic-border-width-thinner);
120
+ padding: $unnnic-space-2 $unnnic-space-4;
109
121
  }
110
122
  }
111
123
 
112
124
  &.input--has-icon-left {
113
- padding-left: $unnnic-spacing-sm + $unnnic-icon-size-sm +
114
- $unnnic-spacing-xs - $unnnic-border-width-thinner;
125
+ padding-left: $unnnic-space-10;
115
126
  }
116
127
 
117
128
  &.input--has-icon-right {
118
- padding-right: $unnnic-spacing-sm + $unnnic-icon-size-sm +
119
- $unnnic-spacing-xs - $unnnic-border-width-thinner;
129
+ padding-right: $unnnic-space-10;
130
+ &.input--has-clear-icon {
131
+ padding-right: $unnnic-space-10 + $unnnic-space-6;
132
+ }
133
+ }
134
+
135
+ &.input--has-clear-icon {
136
+ padding-right: $unnnic-space-10;
120
137
  }
121
138
 
122
139
  &.error {
@@ -126,7 +143,7 @@ export default {
126
143
  &:-ms-input-placeholder,
127
144
  &::-ms-input-placeholder {
128
145
  /* Internet Explorer 10-11 */
129
- color: $unnnic-color-brand-sec;
146
+ color: $unnnic-color-fg-muted;
130
147
  }
131
148
  }
132
149
  </style>
@@ -1,43 +1,41 @@
1
1
  @use '@/assets/scss/unnnic' as *;
2
2
 
3
3
  @mixin input-base {
4
- background: $unnnic-color-neutral-white;
5
- border: $unnnic-border-width-thinner solid $unnnic-color-neutral-clean;
4
+ background: $unnnic-color-white;
5
+ border: $unnnic-border-width-thinner solid $unnnic-color-border-base;
6
6
  outline: none;
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;
7
+ border-radius: $unnnic-radius-2;
8
+ color: $unnnic-color-fg-emphasized;
9
+ caret-color: $unnnic-color-fg-muted;
10
+ font: $unnnic-font-body;
12
11
 
13
- &:focus {
14
- border-color: $unnnic-color-weni-600;
12
+ &:focus,
13
+ &.focus {
14
+ border-color: $unnnic-color-border-active;
15
15
  }
16
16
 
17
17
  &::placeholder {
18
- color: $unnnic-color-neutral-cleanest;
19
- opacity: 1; /* Firefox */
18
+ color: $unnnic-color-fg-muted;
19
+ opacity: 1;
20
+ /* Firefox */
20
21
  }
21
22
 
22
23
  &:disabled {
23
- border-color: $unnnic-color-neutral-cleanest;
24
- background-color: $unnnic-color-neutral-lightest;
24
+ border-color: $unnnic-color-border-muted;
25
+ background-color: $unnnic-color-bg-muted;
25
26
  cursor: not-allowed;
26
- color: $unnnic-color-neutral-cleanest;
27
+ color: $unnnic-color-fg-muted;
27
28
  }
28
29
  }
29
30
 
30
31
  @mixin input-sm-font {
31
- font-size: $unnnic-font-size-body-md;
32
- line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
32
+ font: $unnnic-font-body;
33
33
  }
34
34
 
35
35
  @mixin input-md-font {
36
- font-size: $unnnic-font-size-body-gt;
37
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
36
+ font: $unnnic-font-body;
38
37
  }
39
38
 
40
39
  @mixin input-error {
41
- border-color: $unnnic-color-aux-red-500;
42
- color: $unnnic-color-aux-red-500;
43
- }
40
+ border-color: $unnnic-color-border-critical;
41
+ }
@@ -7,17 +7,18 @@
7
7
  <slot name="label" />
8
8
  </p>
9
9
 
10
- <p
10
+ <UnnnicLabel
11
11
  v-else-if="label"
12
12
  class="unnnic-form__label"
13
- >
14
- {{ fullySanitize(label) }}
15
- </p>
13
+ :label="label"
14
+ :tooltip="tooltip"
15
+ />
16
16
 
17
17
  <TextInput
18
18
  v-bind="$attrs"
19
19
  v-model="val"
20
20
  class="unnnic-form-input"
21
+ :forceActiveStatus="forceActiveStatus"
21
22
  :placeholder="placeholder"
22
23
  :iconLeft="iconLeft"
23
24
  :iconRight="iconRight"
@@ -28,24 +29,43 @@
28
29
  :size="size"
29
30
  :mask="mask"
30
31
  :nativeType="nativeType"
32
+ :maxlength="maxlength"
33
+ :disabled="disabled"
34
+ :readonly="readonly"
35
+ :showClear="showClear"
36
+ @clear="$emit('clear')"
31
37
  />
32
38
 
33
- <p
34
- v-if="message"
35
- class="unnnic-form__message"
36
- >
37
- {{ fullySanitize(message) }}
38
- </p>
39
+ <section class="unnnic-form__hints-container">
40
+ <section class="unnnic-form__message-container">
41
+ <p
42
+ v-if="message"
43
+ class="unnnic-form__message"
44
+ >
45
+ {{ fullySanitize(message) }}
46
+ </p>
47
+ <p
48
+ v-if="!!errors.length"
49
+ class="unnnic-form__message error"
50
+ >
51
+ {{ Array.isArray(errors) ? errors.join(', ') : errors }}
52
+ </p>
53
+ </section>
54
+ <p v-if="maxlength && showMaxlengthCounter">
55
+ {{ (val || '').length }} / {{ maxlength }}
56
+ </p>
57
+ </section>
39
58
  </div>
40
59
  </template>
41
60
 
42
61
  <script>
43
62
  import { fullySanitize } from '../../utils/sanitize';
44
63
  import TextInput from './TextInput.vue';
64
+ import UnnnicLabel from '../Label/Label.vue';
45
65
 
46
66
  export default {
47
67
  name: 'UnnnicInput',
48
- components: { TextInput },
68
+ components: { TextInput, UnnnicLabel },
49
69
  props: {
50
70
  placeholder: {
51
71
  type: String,
@@ -68,19 +88,23 @@ export default {
68
88
  },
69
89
  message: {
70
90
  type: String,
71
- default: null,
91
+ default: '',
92
+ },
93
+ errors: {
94
+ type: [String, Array],
95
+ default: '',
72
96
  },
73
97
  label: {
74
98
  type: String,
75
- default: null,
99
+ default: '',
76
100
  },
77
101
  iconLeft: {
78
102
  type: String,
79
- default: null,
103
+ default: '',
80
104
  },
81
105
  iconRight: {
82
106
  type: String,
83
- default: null,
107
+ default: '',
84
108
  },
85
109
  allowTogglePassword: {
86
110
  type: Boolean,
@@ -88,11 +112,11 @@ export default {
88
112
  },
89
113
  iconLeftClickable: {
90
114
  type: Boolean,
91
- default: null,
115
+ default: false,
92
116
  },
93
117
  iconRightClickable: {
94
118
  type: Boolean,
95
- default: null,
119
+ default: false,
96
120
  },
97
121
  hasCloudyColor: {
98
122
  type: Boolean,
@@ -106,8 +130,38 @@ export default {
106
130
  type: [String, Array],
107
131
  default: '',
108
132
  },
133
+ tooltip: {
134
+ type: String,
135
+ default: '',
136
+ },
137
+ maxlength: {
138
+ type: [Number, null],
139
+ default: null,
140
+ },
141
+ showMaxlengthCounter: {
142
+ type: Boolean,
143
+ default: false,
144
+ },
145
+ disabled: {
146
+ type: Boolean,
147
+ default: false,
148
+ },
149
+ readonly: {
150
+ type: Boolean,
151
+ default: false,
152
+ },
153
+ forceActiveStatus: {
154
+ type: Boolean,
155
+ default: false,
156
+ },
157
+ showClear: {
158
+ type: Boolean,
159
+ default: false,
160
+ },
109
161
  },
110
- emits: ['update:modelValue'],
162
+
163
+ emits: ['update:modelValue', 'clear'],
164
+
111
165
  data() {
112
166
  return {
113
167
  val: this.modelValue,
@@ -138,27 +192,37 @@ export default {
138
192
  <style lang="scss" scoped>
139
193
  @use '@/assets/scss/unnnic' as *;
140
194
 
195
+ * {
196
+ margin: 0;
197
+ padding: 0;
198
+ box-sizing: border-box;
199
+ }
200
+
141
201
  .unnnic-form {
142
- font-family: $unnnic-font-family-secondary;
143
202
  position: relative;
144
203
 
145
204
  &__message {
146
- font-size: $unnnic-font-size-body-md;
147
- margin: $unnnic-spacing-stack-nano 0;
148
- color: $unnnic-color-feedback-red;
205
+ &.error {
206
+ color: $unnnic-color-fg-critical;
207
+ }
149
208
  }
150
209
 
151
210
  &__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;
211
+ margin-bottom: $unnnic-space-1;
212
+ }
213
+
214
+ &__hints-container {
215
+ display: flex;
216
+ justify-content: space-between;
217
+ margin-top: $unnnic-space-1;
218
+ font: $unnnic-font-caption-2;
219
+ color: $unnnic-color-fg-base;
157
220
  }
158
221
 
159
- &.sm &__label {
160
- font-size: $unnnic-font-size-body-md;
161
- line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
222
+ &__message-container {
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: $unnnic-space-1;
162
226
  }
163
227
  }
164
228
  </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,10 +100,6 @@ 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,
@@ -108,8 +112,28 @@ export default {
108
112
  type: String,
109
113
  default: 'md',
110
114
  },
115
+ maxlength: {
116
+ type: Number,
117
+ default: null,
118
+ },
119
+ disabled: {
120
+ type: Boolean,
121
+ default: false,
122
+ },
123
+ readonly: {
124
+ type: Boolean,
125
+ default: false,
126
+ },
127
+ forceActiveStatus: {
128
+ type: Boolean,
129
+ default: false,
130
+ },
131
+ showClear: {
132
+ type: Boolean,
133
+ default: false,
134
+ },
111
135
  },
112
- emits: ['icon-left-click', 'icon-right-click'],
136
+ emits: ['icon-left-click', 'icon-right-click', 'clear'],
113
137
  data() {
114
138
  return {
115
139
  isFocused: false,
@@ -118,7 +142,7 @@ export default {
118
142
  },
119
143
  computed: {
120
144
  isDisabled() {
121
- return this.$attrs.disabled;
145
+ return this.$attrs.disabled || this.disabled;
122
146
  },
123
147
 
124
148
  iconRightSvg() {
@@ -131,22 +155,22 @@ export default {
131
155
 
132
156
  iconScheme() {
133
157
  if (this.type === 'error') {
134
- return 'aux-red-500';
158
+ return 'fg-critical';
135
159
  }
136
160
 
137
161
  if (this.isDisabled) {
138
- return 'neutral-cleanest';
162
+ return 'fg-muted';
139
163
  }
140
164
 
141
- if (this.modelValue || this.isFocused) {
142
- return 'neutral-dark';
165
+ if (this.modelValue || this.isFocused || this.forceActiveStatus) {
166
+ return 'color-gray-700';
143
167
  }
144
168
 
145
169
  if (this.hasCloudyColor) {
146
- return 'neutral-cloudy';
170
+ return 'fg-base';
147
171
  }
148
172
 
149
- return 'neutral-cloudy';
173
+ return 'fg-base';
150
174
  },
151
175
 
152
176
  attributes() {
@@ -171,6 +195,10 @@ export default {
171
195
  if (this.iconLeftClickable) this.$emit('icon-left-click');
172
196
  },
173
197
 
198
+ onClearClick() {
199
+ this.$emit('clear');
200
+ },
201
+
174
202
  onIconRightClick() {
175
203
  if (this.attributes.disabled) return;
176
204
  if (this.allowTogglePassword) this.showPassword = !this.showPassword;
@@ -183,42 +211,38 @@ export default {
183
211
  <style lang="scss" scoped>
184
212
  @use '@/assets/scss/unnnic' as *;
185
213
 
214
+ .text-input {
215
+ position: relative;
216
+ }
217
+
186
218
  .icon {
187
- &-left,
188
- &-right {
219
+ &-left {
220
+ position: absolute;
221
+ top: 50%;
222
+ transform: translateY(-50%);
223
+ left: $unnnic-space-4;
224
+
189
225
  &:not(.clickable) {
190
226
  pointer-events: none;
191
227
  }
192
228
  }
193
229
 
194
- &-left {
230
+ &-right-container {
195
231
  position: absolute;
196
- top: $unnnic-spacing-ant + 0.1875 * $unnnic-font-size;
197
- left: $unnnic-inline-sm - $unnnic-border-width-thinner;
198
- }
232
+ top: 50%;
233
+ transform: translateY(-50%);
234
+ right: $unnnic-space-4;
199
235
 
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;
236
+ display: flex;
237
+ align-items: center;
238
+ gap: $unnnic-space-2;
208
239
 
209
- &.size--sm {
210
- .icon-left,
211
- .icon-right {
212
- top: $unnnic-spacing-xs + 0.125 * $unnnic-font-size;
240
+ .icon-clear {
241
+ cursor: pointer;
242
+ }
243
+ .icon-right:not(.clickable) {
244
+ pointer-events: none;
213
245
  }
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
246
  }
223
247
  }
224
248
  </style>
@@ -74,22 +74,22 @@ describe('TextInput.vue', () => {
74
74
 
75
75
  test('computes the correct iconScheme based on various states', async () => {
76
76
  await wrapper.setProps({ type: 'error' });
77
- expect(wrapper.vm.iconScheme).toBe('aux-red-500');
77
+ expect(wrapper.vm.iconScheme).toBe('fg-critical');
78
78
 
79
79
  await wrapper.setProps({ type: 'normal' });
80
80
  await wrapper.setData({ isDisabled: true });
81
- expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
81
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
82
82
 
83
83
  await wrapper.setData({ isDisabled: false });
84
84
  await wrapper.setProps({ modelValue: 'text' });
85
- expect(wrapper.vm.iconScheme).toBe('neutral-dark');
85
+ expect(wrapper.vm.iconScheme).toBe('color-gray-700');
86
86
 
87
87
  await wrapper.setData({ isFocused: true });
88
- expect(wrapper.vm.iconScheme).toBe('neutral-dark');
88
+ expect(wrapper.vm.iconScheme).toBe('color-gray-700');
89
89
 
90
90
  await wrapper.setProps({ hasCloudyColor: true, modelValue: '' });
91
91
  await wrapper.setData({ isFocused: false });
92
- expect(wrapper.vm.iconScheme).toBe('neutral-cloudy');
92
+ expect(wrapper.vm.iconScheme).toBe('fg-base');
93
93
  });
94
94
 
95
95
  test('attributes computed property returns combined attributes and props', () => {
@@ -2,8 +2,21 @@
2
2
 
3
3
  exports[`Input.vue > matches the snapshot 1`] = `
4
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="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>
7
- <p data-v-d890ad85="" class="unnnic-form__message">Error message</p>
5
+ <section data-v-7f222291="" data-v-d890ad85="" class="unnnic-label unnnic-form__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" 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" hascloudycolor="false" showclear="false" type="text" value=""><span data-v-26446d8e="" data-v-a0d36167="" class="material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span>
10
+ <section data-v-a0d36167="" class="icon-right-container">
11
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span>
12
+ </section>
13
+ </div>
14
+ <section data-v-d890ad85="" class="unnnic-form__hints-container">
15
+ <section data-v-d890ad85="" class="unnnic-form__message-container">
16
+ <p data-v-d890ad85="" class="unnnic-form__message">Error message</p>
17
+ <!--v-if-->
18
+ </section>
19
+ <!--v-if-->
20
+ </section>
8
21
  </div>"
9
22
  `;
@@ -1,3 +1,9 @@
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`] = `
4
+ "<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" hascloudycolor="false" showclear="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--fg-base unnnic-icon-size--ant unnnic--clickable icon-left clickable" data-testid="material-icon" translate="no">search</span>
5
+ <section data-v-a0d36167="" class="icon-right-container">
6
+ <!--v-if--><span data-v-26446d8e="" data-v-a0d36167="" class="material-symbols-rounded unnnic-icon-scheme--fg-base unnnic-icon-size--ant unnnic--clickable icon-right clickable" data-testid="material-icon" translate="no">clear</span>
7
+ </section>
8
+ </div>"
9
+ `;