@weni/unnnic-system 3.5.3-alpha.1 → 3.6.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 (229) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
  3. package/dist/components/Alert/Alert.vue.d.ts +117 -18
  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 +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 +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 +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 +31 -24
  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 +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 +38 -31
  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 +29 -176
  55. package/dist/components/DatePicker/DatePicker.vue.d.ts +3 -3
  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 +30 -38
  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 +1 -32
  67. package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
  68. package/dist/components/Input/Input.vue.d.ts +29 -176
  69. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  70. package/dist/components/Input/TextInput.vue.d.ts +14 -83
  71. package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
  72. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +33 -180
  73. package/dist/components/InputNext/InputNext.vue.d.ts +4 -4
  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 +6 -6
  78. package/dist/components/ModalNext/ModalNext.vue.d.ts +34 -181
  79. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +8 -8
  80. package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
  81. package/dist/components/MultiSelect/MultiSelect.vue.d.ts +14 -20
  82. package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
  83. package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
  84. package/dist/components/Radio/Radio.vue.d.ts +6 -8
  85. package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
  86. package/dist/components/SelectSmart/SelectSmart.vue.d.ts +51 -113
  87. package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +8 -8
  88. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +27 -20
  89. package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
  90. package/dist/components/SelectTime/index.vue.d.ts +14 -83
  91. package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +2 -2
  92. package/dist/components/Slider/Slider.vue.d.ts +2 -2
  93. package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
  94. package/dist/components/Switch/Switch.vue.d.ts +21 -55
  95. package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
  96. package/dist/components/Tab/Tab.vue.d.ts +2 -13
  97. package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
  98. package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
  99. package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
  100. package/dist/components/Tag/BrandTag.vue.d.ts +2 -2
  101. package/dist/components/Tag/DefaultTag.vue.d.ts +2 -2
  102. package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
  103. package/dist/components/Tag/Tag.vue.d.ts +8 -8
  104. package/dist/components/TextArea/TextArea.vue.d.ts +30 -38
  105. package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
  106. package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
  107. package/dist/components/Tour/Tour.vue.d.ts +3 -3
  108. package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
  109. package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
  110. package/dist/components/index.d.ts +1184 -2540
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/{es-1c7253d4.mjs → es-92fbe460.mjs} +1 -1
  113. package/dist/{index-ff0a404c.mjs → index-0da47957.mjs} +10936 -18388
  114. package/dist/locales/en.json.d.ts +1 -2
  115. package/dist/locales/es.json.d.ts +1 -2
  116. package/dist/locales/pt_br.json.d.ts +1 -2
  117. package/dist/{pt-br-316f1627.mjs → pt-br-c29b6c9a.mjs} +1 -1
  118. package/dist/style.css +1 -1
  119. package/dist/unnnic.mjs +148 -157
  120. package/dist/unnnic.umd.js +51 -53
  121. package/dist/utils/call.d.ts +1 -2
  122. package/dist/utils/call.d.ts.map +1 -1
  123. package/package.json +2 -4
  124. package/src/components/Alert/Alert.vue +135 -26
  125. package/src/components/Alert/AlertBanner.vue +182 -0
  126. package/src/components/Alert/AlertCaller.vue +49 -0
  127. package/src/components/Alert/Version1dot1.vue +36 -0
  128. package/src/components/Alert/__tests__/Alert.spec.js +45 -2
  129. package/src/components/Alert/__tests__/AlertBanner.spec.js +89 -0
  130. package/src/components/Alert/__tests__/AlertCaller.spec.js +98 -0
  131. package/src/components/Alert/__tests__/Version1dot1.spec.js +21 -0
  132. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +7 -11
  133. package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
  134. package/src/components/Button/Button.vue +107 -64
  135. package/src/components/Button/types.ts +1 -0
  136. package/src/components/Checkbox/Checkbox.vue +64 -98
  137. package/src/components/Checkbox/__tests__/Checkbox.spec.js +21 -6
  138. package/src/components/FormElement/FormElement.vue +91 -51
  139. package/src/components/Icon.vue +1 -23
  140. package/src/components/Input/BaseInput.vue +14 -31
  141. package/src/components/Input/Input.scss +21 -19
  142. package/src/components/Input/Input.vue +30 -94
  143. package/src/components/Input/TextInput.vue +58 -82
  144. package/src/components/Input/__test__/TextInput.spec.js +5 -5
  145. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +3 -16
  146. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -7
  147. package/src/components/Label/Label.vue +21 -52
  148. package/src/components/Label/__tests__/Label.spec.js +1 -1
  149. package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
  150. package/src/components/Radio/Radio.vue +67 -80
  151. package/src/components/Radio/__test__/Radio.spec.js +20 -14
  152. package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
  153. package/src/components/Switch/Switch.vue +97 -120
  154. package/src/components/Switch/__tests__/Switch.spec.js +75 -8
  155. package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +6 -5
  156. package/src/components/Tab/Tab.vue +23 -37
  157. package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
  158. package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
  159. package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
  160. package/src/components/TextArea/TextArea.vue +9 -13
  161. package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +2 -7
  162. package/src/components/index.ts +9 -30
  163. package/src/locales/en.json +1 -2
  164. package/src/locales/es.json +1 -2
  165. package/src/locales/pt_br.json +1 -2
  166. package/src/stories/Alert.stories.js +67 -6
  167. package/src/stories/Button.stories.js +17 -2
  168. package/src/stories/Checkbox.stories.js +4 -11
  169. package/src/stories/Icon.stories.js +15 -24
  170. package/src/stories/Input.stories.js +3 -16
  171. package/src/stories/Label.stories.js +0 -7
  172. package/src/stories/Switch.stories.js +5 -10
  173. package/src/stories/Tab.stories.js +4 -11
  174. package/src/types/scheme-colors.d.ts +0 -1
  175. package/src/utils/call.js +18 -46
  176. package/dist/assets/tokens/iconSizeTokens.d.ts +0 -2
  177. package/dist/assets/tokens/iconSizeTokens.d.ts.map +0 -1
  178. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +0 -28
  179. package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +0 -1
  180. package/dist/components/Toast/Toast.vue.d.ts +0 -16
  181. package/dist/components/Toast/Toast.vue.d.ts.map +0 -1
  182. package/dist/components/Toast/ToastManager.d.ts +0 -14
  183. package/dist/components/Toast/ToastManager.d.ts.map +0 -1
  184. package/dist/components/Toast/types.d.ts +0 -35
  185. package/dist/components/Toast/types.d.ts.map +0 -1
  186. package/dist/components/ui/popover/Popover.vue.d.ts +0 -23
  187. package/dist/components/ui/popover/Popover.vue.d.ts.map +0 -1
  188. package/dist/components/ui/popover/PopoverContent.vue.d.ts +0 -43
  189. package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +0 -1
  190. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +0 -19
  191. package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +0 -1
  192. package/dist/components/ui/popover/index.d.ts +0 -5
  193. package/dist/components/ui/popover/index.d.ts.map +0 -1
  194. package/src/assets/icons/checkbox-checked-disabled.svg +0 -3
  195. package/src/assets/icons/checkbox-checked.svg +0 -3
  196. package/src/assets/icons/checkbox-less-disabled.svg +0 -3
  197. package/src/assets/icons/checkbox-less.svg +0 -3
  198. package/src/assets/icons/radio-checked.svg +0 -3
  199. package/src/assets/icons/switch-checked-disabled.svg +0 -3
  200. package/src/assets/icons/switch-checked.svg +0 -3
  201. package/src/assets/tokens/iconSizeTokens.ts +0 -10
  202. package/src/components/CheckboxGroup/CheckboxGroup.vue +0 -96
  203. package/src/components/Popover/__tests__/Popover.spec.js +0 -147
  204. package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +0 -8
  205. package/src/components/Popover/index.vue +0 -146
  206. package/src/components/RadioGroup/RadioGroup.vue +0 -142
  207. package/src/components/Select/SelectOption.vue +0 -65
  208. package/src/components/Select/__tests__/Select.spec.js +0 -412
  209. package/src/components/Select/__tests__/SelectItem.spec.js +0 -330
  210. package/src/components/Select/__tests__/SelectOption.spec.js +0 -174
  211. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +0 -97
  212. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +0 -15
  213. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +0 -25
  214. package/src/components/Select/index.vue +0 -245
  215. package/src/components/Toast/Toast.vue +0 -246
  216. package/src/components/Toast/ToastManager.ts +0 -110
  217. package/src/components/Toast/__tests__/Toast.spec.js +0 -284
  218. package/src/components/Toast/__tests__/ToastManager.spec.js +0 -294
  219. package/src/components/Toast/types.ts +0 -57
  220. package/src/components/ui/popover/Popover.vue +0 -19
  221. package/src/components/ui/popover/PopoverContent.vue +0 -98
  222. package/src/components/ui/popover/PopoverTrigger.vue +0 -23
  223. package/src/components/ui/popover/index.ts +0 -4
  224. package/src/stories/CheckboxGroup.stories.js +0 -105
  225. package/src/stories/Popover.stories.js +0 -306
  226. package/src/stories/RadioGroup.stories.js +0 -144
  227. package/src/stories/Select.stories.js +0 -158
  228. package/src/stories/Toast.mdx +0 -123
  229. package/src/stories/Toast.stories.js +0 -126
@@ -1,33 +1,29 @@
1
1
  <!-- eslint-disable vue/multi-word-component-names -->
2
2
  <template>
3
- <section class="unnnic-radio-container">
4
- <label>
5
- <input
6
- class="unnnic-radio"
7
- type="radio"
8
- :disabled="disabled"
9
- :checked="computedModelValue === value"
10
- @change="click"
11
- :name="computedName"
12
- v-bind="pick($attrs, ['id'])"
13
- />
14
-
15
- <p
16
- :class="[
17
- 'unnnic-radio__label',
18
- { 'unnnic-radio__label--disabled': disabled },
19
- ]"
20
- >
21
- {{ label }}
22
- <slot />
23
- </p>
24
- </label>
25
- </section>
3
+ <div
4
+ :class="[
5
+ 'unnnic-radio-container',
6
+ `unnnic-radio-container--${size}`,
7
+ disabled ? 'disabled' : null,
8
+ ]"
9
+ @click="click"
10
+ >
11
+ <UnnnicIcon
12
+ class="unnnic-radio"
13
+ :icon="icon"
14
+ :scheme="color"
15
+ :size="size"
16
+ />
17
+
18
+ <span class="label">
19
+ <slot />
20
+ </span>
21
+ </div>
26
22
  </template>
27
23
 
28
24
  <script setup>
29
- import { pick } from 'lodash';
30
- import { inject, computed } from 'vue';
25
+ import { computed } from 'vue';
26
+ import UnnnicIcon from '../Icon.vue';
31
27
 
32
28
  const props = defineProps({
33
29
  modelValue: {
@@ -42,88 +38,79 @@ const props = defineProps({
42
38
  type: Boolean,
43
39
  default: false,
44
40
  },
45
- label: {
41
+ size: {
46
42
  type: String,
47
- default: '',
48
- },
49
- name: {
50
- type: String,
51
- default: '',
43
+ default: 'md',
44
+ validator(value) {
45
+ return ['md', 'sm'].includes(value);
46
+ },
52
47
  },
53
48
  });
54
49
 
55
50
  const emit = defineEmits(['update:modelValue']);
56
51
 
57
- const contextModelValue = inject('contextModelValue', undefined);
58
- const contextName = inject('contextName', undefined);
52
+ const valueName = computed(() =>
53
+ props.modelValue === props.value ? 'selected' : 'default',
54
+ );
55
+ const icon = computed(
56
+ () =>
57
+ ({
58
+ selected: 'radio-selected',
59
+ default: props.disabled ? 'radio-disable' : 'radio-default',
60
+ })[valueName.value],
61
+ );
62
+ const color = computed(() => {
63
+ if (props.disabled) {
64
+ return 'brand-sec';
65
+ }
66
+
67
+ return valueName.value === 'selected' ? 'brand-weni' : 'neutral-cleanest';
68
+ });
59
69
 
60
70
  function click() {
61
71
  if (!props.disabled) {
62
72
  emit('update:modelValue', props.value);
63
-
64
- if (contextModelValue) {
65
- contextModelValue.value = props.value;
66
- }
67
73
  }
68
74
  }
69
-
70
- const computedModelValue = computed(() => {
71
- return contextModelValue?.value || props.modelValue;
72
- });
73
-
74
- const computedName = computed(() => {
75
- return contextName?.value || props.name;
76
- });
77
75
  </script>
78
76
 
79
77
  <style lang="scss" scoped>
80
78
  @use '@/assets/scss/unnnic' as *;
81
79
 
82
- $radio-size: 21px;
83
-
84
80
  .unnnic-radio-container {
85
81
  display: inline-flex;
86
- flex-direction: column;
82
+ align-items: center;
87
83
 
88
- label {
89
- display: flex;
90
- align-items: center;
91
- gap: $unnnic-space-2;
84
+ &:not(.disabled) {
85
+ cursor: pointer;
92
86
  }
93
87
 
94
- .unnnic-radio {
95
- appearance: none;
96
- width: $radio-size;
97
- height: $radio-size;
98
- margin: 0;
99
- background-color: $unnnic-color-bg-base;
100
- border: 1px solid $unnnic-color-border-base;
101
- border-radius: $unnnic-radius-full;
102
- box-sizing: border-box;
103
- outline: none;
88
+ &--sm .unnnic-radio {
89
+ margin: $unnnic-spacing-stack-nano $unnnic-spacing-inline-nano;
90
+ }
104
91
 
105
- &:checked {
106
- border-width: 0;
107
- background-color: $unnnic-color-bg-active;
108
- background-image: url('@/assets/icons/radio-checked.svg');
109
- background-position: center;
110
- background-repeat: no-repeat;
111
- }
92
+ &--md .unnnic-radio {
93
+ margin: $unnnic-spacing-stack-nano 0;
94
+ margin-left: $unnnic-spacing-inline-nano;
95
+ margin-right: $unnnic-spacing-inline-xs;
96
+ }
112
97
 
113
- &:disabled {
114
- background-color: $unnnic-color-bg-muted;
115
- border: 1px solid $unnnic-color-border-muted;
116
- }
98
+ .label {
99
+ font-family: $unnnic-font-family-secondary;
100
+ font-weight: $unnnic-font-weight-regular;
101
+ color: $unnnic-color-neutral-darkest;
102
+ margin: $unnnic-spacing-stack-nano 0;
103
+ margin-right: $unnnic-spacing-inline-nano;
117
104
  }
118
105
 
119
- .unnnic-radio__label {
120
- margin: 0;
121
- font: $unnnic-font-body;
122
- color: $unnnic-color-fg-emphasized;
106
+ &--sm .label {
107
+ font-size: $unnnic-font-size-body-md;
108
+ line-height: $unnnic-font-size-body-md + $unnnic-line-height-md;
109
+ }
123
110
 
124
- &--disabled {
125
- color: $unnnic-color-fg-muted;
126
- }
111
+ &--md .label {
112
+ font-size: $unnnic-font-size-body-gt;
113
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-md;
127
114
  }
128
115
  }
129
116
  </style>
@@ -33,35 +33,41 @@ describe('Radio.vue', () => {
33
33
  expect(wrapper.exists()).toBe(true);
34
34
  });
35
35
 
36
- test('renders input with correct attributes', () => {
37
- const input = wrapper.find('input');
38
- expect(input.exists()).toBe(true);
39
- expect(input.attributes('type')).toBe('radio');
40
- expect(input.attributes('disabled')).toBe(undefined);
41
- expect(input.attributes('checked')).toBe(undefined);
36
+ test('renders UnnnicIcon component with correct props', () => {
37
+ const unnnicIcon = wrapper.findComponent(UnnnicIcon);
38
+ expect(unnnicIcon.exists()).toBe(true);
39
+ expect(unnnicIcon.props('icon')).toBe('radio-default');
40
+ expect(unnnicIcon.props('scheme')).toBe('neutral-cleanest');
41
+ expect(unnnicIcon.props('size')).toBe('md');
42
+ });
43
+
44
+ test('applies the correct size class', async () => {
45
+ expect(wrapper.classes()).toContain('unnnic-radio-container--md');
46
+
47
+ await wrapper.setProps({ size: 'sm' });
48
+ expect(wrapper.classes()).toContain('unnnic-radio-container--sm');
42
49
  });
43
50
 
44
51
  test('applies disabled class when disabled prop is true', async () => {
45
52
  await wrapper.setProps({ disabled: true });
46
- expect(wrapper.find('.unnnic-radio__label').classes()).toContain(
47
- 'unnnic-radio__label--disabled',
48
- );
53
+ expect(wrapper.classes()).toContain('disabled');
49
54
  });
50
55
 
51
56
  test('icon changes based on valueName', async () => {
52
57
  await wrapper.setProps({ modelValue: 'option1' });
53
- const input = wrapper.find('input');
54
- expect(input.attributes()).toHaveProperty('checked');
58
+ const unnnicIcon = wrapper.findComponent(UnnnicIcon);
59
+ expect(unnnicIcon.props('icon')).toBe('radio-selected');
55
60
  });
56
61
 
57
62
  test('icon and color change when disabled is true', async () => {
58
63
  await wrapper.setProps({ disabled: true });
59
- const input = wrapper.find('input');
60
- expect(input.attributes()).toHaveProperty('disabled');
64
+ const unnnicIcon = wrapper.findComponent(UnnnicIcon);
65
+ expect(unnnicIcon.props('icon')).toBe('radio-disable');
66
+ expect(unnnicIcon.props('scheme')).toBe('brand-sec');
61
67
  });
62
68
 
63
69
  test('emits update:modelValue with correct value when clicked and not disabled', async () => {
64
- await wrapper.find('input').trigger('change');
70
+ await wrapper.trigger('click');
65
71
  expect(wrapper.emitted('update:modelValue')).toBeTruthy();
66
72
  expect(wrapper.emitted('update:modelValue')[0]).toEqual(['option1']);
67
73
  });
@@ -1,7 +1,7 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`Radio.vue > matches the snapshot 1`] = `
4
- "<section data-v-38c6bf5e="" class="unnnic-radio-container" size="md"><label data-v-38c6bf5e=""><input data-v-38c6bf5e="" class="unnnic-radio" type="radio" name="">
5
- <p data-v-38c6bf5e="" class="unnnic-radio__label"> Option 1</p>
6
- </label></section>"
4
+ "<div data-v-38c6bf5e="" class="unnnic-radio-container unnnic-radio-container--md"><svg data-v-26446d8e="" data-v-38c6bf5e="" width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg" class="unnnic-icon unnnic-icon--size-svg-md unnnic-icon__size--md unnnic-icon-scheme--neutral-cleanest unnnic-radio" data-testid="custom-icon">
5
+ <circle cx="20" cy="20.0005" r="14.5" stroke="#3B414D" class="primary-stroke"></circle>
6
+ </svg><span data-v-38c6bf5e="" class="label">Option 1</span></div>"
7
7
  `;
@@ -1,55 +1,49 @@
1
1
  <template>
2
- <section class="unnnic-switch-wrapper">
3
- <UnnnicLabel
4
- v-if="label"
5
- :label="label"
6
- :tooltip="labelTooltip"
7
- :useHtmlTooltip="labelUseHtmlTooltip"
8
- class="unnnic-switch__label"
2
+ <div class="unnnic-switch">
3
+ <div
4
+ v-if="textLeft"
5
+ data-test-id="switch-text-left"
6
+ :class="[
7
+ 'unnnic-switch__label',
8
+ 'unnnic-switch__label__left',
9
+ `unnnic-switch__label__${size}`,
10
+ ]"
11
+ >
12
+ {{ textLeft }}
13
+ </div>
14
+
15
+ <UnnnicIcon
16
+ :class="{ 'unnnic-switch__icon': true, active: isActive }"
17
+ :icon="currentIcon"
18
+ :size="iconSize"
19
+ :scheme="iconScheme"
20
+ :lineHeight="iconLineHeight"
21
+ :disabled="disabled"
22
+ :clickable="!disabled"
23
+ data-test-id="switch-icon"
24
+ @click="toggleState"
9
25
  />
10
26
 
11
- <label>
12
- <input
13
- class="unnnic-switch"
14
- type="checkbox"
15
- :disabled="disabled"
16
- :checked="modelValue"
17
- @change="toggleState"
18
- v-bind="pick($attrs, ['id', 'name'])"
19
- />
20
-
21
- <p
22
- v-if="option || textLeft || textRight"
23
- :class="[
24
- 'unnnic-switch__option',
25
- { 'unnnic-switch__option--disabled': disabled },
26
- ]"
27
- data-testid="switch-option"
28
- >
29
- {{ option }}
30
- {{ textLeft }}
31
- {{ textRight }}
32
- </p>
33
- </label>
34
-
35
- <p
36
- v-if="helper"
37
- class="unnnic-switch__helper"
27
+ <div
28
+ v-if="textRight"
29
+ data-test-id="switch-text-right"
30
+ :class="[
31
+ 'unnnic-switch__label',
32
+ 'unnnic-switch__label__right',
33
+ `unnnic-switch__label__${size}`,
34
+ ]"
38
35
  >
39
- {{ helper }}
40
- </p>
41
- </section>
36
+ {{ textRight }}
37
+ </div>
38
+ </div>
42
39
  </template>
43
40
 
44
41
  <script>
45
- import { pick } from 'lodash';
46
- import UnnnicLabel from '../Label/Label.vue';
42
+ import UnnnicIcon from '../Icon.vue';
47
43
 
48
44
  export default {
49
45
  name: 'UnnnicSwitch',
50
- components: {
51
- UnnnicLabel,
52
- },
46
+ components: { UnnnicIcon },
53
47
  props: {
54
48
  size: {
55
49
  type: String,
@@ -58,32 +52,6 @@ export default {
58
52
  return ['small', 'medium'].indexOf(value) !== -1;
59
53
  },
60
54
  },
61
-
62
- label: {
63
- type: String,
64
- default: '',
65
- },
66
-
67
- labelTooltip: {
68
- type: String,
69
- default: '',
70
- },
71
-
72
- labelUseHtmlTooltip: {
73
- type: Boolean,
74
- default: false,
75
- },
76
-
77
- option: {
78
- type: String,
79
- default: '',
80
- },
81
-
82
- helper: {
83
- type: String,
84
- default: '',
85
- },
86
-
87
55
  textLeft: {
88
56
  type: String,
89
57
  default: '',
@@ -110,6 +78,33 @@ export default {
110
78
  isActive: false,
111
79
  };
112
80
  },
81
+ computed: {
82
+ currentIcon() {
83
+ if (this.disabled) {
84
+ return this.isActive
85
+ ? 'switch-selected-disabled'
86
+ : 'switch-default-disabled';
87
+ }
88
+
89
+ return 'switch-default';
90
+ },
91
+
92
+ iconSize() {
93
+ return this.size === 'small' ? 'sm' : 'md';
94
+ },
95
+
96
+ iconScheme() {
97
+ if (this.disabled) {
98
+ return 'neutral-soft';
99
+ }
100
+
101
+ return this.isActive === false ? 'neutral-soft' : 'brand-weni';
102
+ },
103
+
104
+ iconLineHeight() {
105
+ return this.size === 'small' ? 'sm' : '';
106
+ },
107
+ },
113
108
 
114
109
  watch: {
115
110
  modelValue: {
@@ -121,8 +116,6 @@ export default {
121
116
  },
122
117
 
123
118
  methods: {
124
- pick,
125
-
126
119
  toggleState() {
127
120
  if (!this.disabled) {
128
121
  if (this.useVModel) {
@@ -140,67 +133,51 @@ export default {
140
133
  <style lang="scss" scoped>
141
134
  @use '@/assets/scss/unnnic' as *;
142
135
 
143
- $switch-width: 38px;
144
- $switch-height: 20px;
145
-
146
- .unnnic-switch-wrapper {
136
+ .unnnic-switch {
147
137
  display: flex;
148
- flex-direction: column;
138
+ flex-direction: row;
149
139
 
150
- label {
151
- display: flex;
152
- align-items: center;
153
- column-gap: $unnnic-space-2;
154
- }
155
- }
140
+ &__label {
141
+ font-family: $unnnic-font-family-secondary;
142
+ font-weight: $unnnic-font-weight-regular;
143
+ color: $unnnic-color-neutral-dark;
156
144
 
157
- .unnnic-switch {
158
- appearance: none;
159
- width: $switch-width;
160
- height: $switch-height;
161
- margin: 0;
162
- background-color: $unnnic-color-bg-muted;
163
- border-radius: $unnnic-radius-3;
164
- box-sizing: border-box;
165
- outline: none;
166
-
167
- background-image: url('@/assets/icons/switch-checked.svg');
168
- background-repeat: no-repeat;
169
- background-position: 4px center;
170
-
171
- transition:
172
- 200ms linear background-position,
173
- 200ms linear background-color;
174
-
175
- &:checked {
176
- background-color: $unnnic-color-bg-active;
177
- background-position: 20px center;
178
- }
145
+ margin: $unnnic-spacing-stack-nano 0;
146
+ margin-right: $unnnic-inline-nano;
179
147
 
180
- &:disabled {
181
- background-color: $unnnic-color-bg-muted;
182
- background-image: url('@/assets/icons/switch-checked-disabled.svg');
183
- }
148
+ &__small {
149
+ font-size: $unnnic-font-size-body-md;
150
+ line-height: $unnnic-font-size-body-md + $unnnic-line-height-md;
151
+ }
184
152
 
185
- &__label {
186
- margin-bottom: $unnnic-space-3;
153
+ &__medium {
154
+ font-size: $unnnic-font-size-body-gt;
155
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-md;
156
+ }
187
157
  }
188
158
 
189
- &__option {
190
- margin: 0;
191
- font: $unnnic-font-body;
192
- color: $unnnic-color-fg-emphasized;
159
+ &__icon {
160
+ align-self: center;
161
+ margin: $unnnic-spacing-stack-nano $unnnic-inline-nano;
162
+
163
+ :deep(#default-circle) {
164
+ transition: 0.2s linear transform;
165
+ }
193
166
 
194
- &--disabled {
195
- color: $unnnic-color-fg-muted;
167
+ &.active {
168
+ :deep(#default-circle) {
169
+ transform: translateX(45%);
170
+ }
196
171
  }
197
172
  }
173
+ }
198
174
 
199
- &__helper {
200
- margin: 0;
201
- margin-left: $switch-width + $unnnic-space-2;
202
- font: $unnnic-font-caption-2;
203
- color: $unnnic-color-fg-base;
175
+ .unnnic-icon__size {
176
+ &--md {
177
+ width: 3 * $unnnic-font-size;
178
+ }
179
+ &--sm {
180
+ width: 2 * $unnnic-font-size;
204
181
  }
205
182
  }
206
183
  </style>
@@ -12,26 +12,93 @@ describe('Switch', () => {
12
12
  beforeEach(() => {
13
13
  wrapper = createWrapper({ modelValue: false });
14
14
  });
15
+ it('should render the component correctly with default props', () => {
16
+ expect(wrapper.exists()).toBe(true);
17
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).exists()).toBe(true);
18
+ expect(wrapper.text()).toBe('');
19
+ });
20
+
21
+ it('should render the left text (textLeft) when provided', async () => {
22
+ await wrapper.setProps({ textLeft: 'Left Text' });
23
+
24
+ // This check ensures that the icon is placed before the switch text
25
+ const switchChildren = wrapper.findComponent(Switch).element.children;
26
+ expect(switchChildren[0].getAttribute('data-test-id')).toBe(
27
+ 'switch-text-left',
28
+ );
29
+ expect(switchChildren[1].getAttribute('data-test-id')).toBe('switch-icon');
30
+ });
31
+
32
+ it('should render the right text (textRight) when provided', async () => {
33
+ await wrapper.setProps({ textRight: 'Right Text' });
34
+
35
+ // This check ensures that the icon is placed after the switch text
36
+ const switchChildren = wrapper.findComponent(Switch).element.children;
37
+ expect(switchChildren[0].getAttribute('data-test-id')).toBe('switch-icon');
38
+ expect(switchChildren[1].getAttribute('data-test-id')).toBe(
39
+ 'switch-text-right',
40
+ );
41
+ });
42
+
43
+ it('should render the correct icon when the switch is disabled/enabled', async () => {
44
+ await wrapper.setProps({ disabled: true });
45
+ const disabledIconComponent = wrapper.findComponent({ name: 'UnnnicIcon' });
46
+ expect(disabledIconComponent.props('icon')).toBe('switch-default-disabled');
15
47
 
16
- it('should render the option when provided', async () => {
17
- await wrapper.setProps({ option: 'Option Text' });
48
+ await wrapper.setProps({ modelValue: true });
49
+ const enabledIconComponent = wrapper.findComponent({ name: 'UnnnicIcon' });
50
+ expect(enabledIconComponent.props('icon')).toBe('switch-selected-disabled');
51
+ });
18
52
 
19
- const switchOption = wrapper.find('[data-testid="switch-option"]');
20
- expect(switchOption.text()).toBe('Option Text');
53
+ it('should render the correct icon based on the isActive state', async () => {
54
+ expect(wrapper.vm.isActive).toBe(false);
55
+ await wrapper.setProps({ modelValue: true });
56
+ expect(wrapper.vm.isActive).toBe(true);
57
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('icon')).toBe(
58
+ 'switch-default',
59
+ );
60
+ });
61
+
62
+ it('should render the correct icon size based on the size prop', async () => {
63
+ await wrapper.setProps({ size: 'small' });
64
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('size')).toBe(
65
+ 'sm',
66
+ );
67
+
68
+ await wrapper.setProps({ size: 'medium' });
69
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('size')).toBe(
70
+ 'md',
71
+ );
72
+ });
73
+
74
+ it('should change the icon color based on the state', async () => {
75
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('scheme')).toBe(
76
+ 'neutral-soft',
77
+ );
78
+
79
+ await wrapper.setProps({ modelValue: true });
80
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('scheme')).toBe(
81
+ 'brand-weni',
82
+ );
83
+
84
+ await wrapper.setProps({ disabled: true });
85
+ expect(wrapper.findComponent({ name: 'UnnnicIcon' }).props('scheme')).toBe(
86
+ 'neutral-soft',
87
+ );
21
88
  });
22
89
 
23
90
  it('should toggle isActive state and emit the correct event when toggleState is called', async () => {
24
91
  const initialIsActive = wrapper.vm.isActive;
25
- const switchInput = wrapper.find('input[type="checkbox"]');
26
- await switchInput.trigger('change');
92
+ const switchIcon = wrapper.findComponent('[ data-test-id="switch-icon"]');
93
+ await switchIcon.trigger('click');
27
94
  expect(wrapper.emitted('update:model-value')).toBeTruthy();
28
95
  expect(wrapper.vm.isActive).toBe(!initialIsActive);
29
96
  });
30
97
 
31
98
  it('should not change state when disabled is true', async () => {
32
99
  await wrapper.setProps({ disabled: true });
33
- const switchInput = wrapper.find('input[type="checkbox"]');
34
- await switchInput.trigger('change');
100
+ const switchIcon = wrapper.findComponent('[ data-test-id="switch-icon"]');
101
+ await switchIcon.trigger('click');
35
102
  expect(wrapper.emitted('update:model-value')).toBeFalsy();
36
103
  expect(wrapper.vm.isActive).toBe(false);
37
104
  });
@@ -1,10 +1,11 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`Switch > should match the snapshot 1`] = `
4
- "<section data-v-e4356c9d="" class="unnnic-switch-wrapper">
5
- <!--v-if--><label data-v-e4356c9d=""><input data-v-e4356c9d="" class="unnnic-switch" type="checkbox">
6
- <!--v-if-->
7
- </label>
4
+ "<div data-v-e4356c9d="" class="unnnic-switch">
5
+ <!--v-if--><svg data-v-3d58a7dd="" data-v-26446d8e="" data-v-e4356c9d="" id="default" width="80" height="40" viewBox="0 0 80 40" xmlns="http://www.w3.org/2000/svg" class="unnnic-icon unnnic-icon--size-svg-md unnnic-icon__size--md unnnic--clickable unnnic-icon-scheme--neutral-soft unnnic-switch__icon" data-testid="custom-icon" lineHeight="" disabled="false" data-test-id="switch-icon">
6
+ <rect data-v-3d58a7dd="" x="4.20013" y="2.10046" width="71.6" height="35.8" rx="17.9" class="primary"></rect>
7
+ <circle data-v-3d58a7dd="" id="default-circle" cx="22.5" cy="20.0005" r="12.5" fill="white"></circle>
8
+ </svg>
8
9
  <!--v-if-->
9
- </section>"
10
+ </div>"
10
11
  `;