@teammodlr/ui-kit 1.0.7 → 2.0.1

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/lib/__storybook__/argTypes.d.ts +10 -1
  2. package/lib/components/avatar/Avatar.vue.d.ts +16 -30
  3. package/lib/components/avatar/style/Avatar.css.d.ts +9 -0
  4. package/lib/components/avatar/style/index.d.ts +1 -0
  5. package/lib/components/avatargroup/AvatarGroup.vue.d.ts +28 -13
  6. package/lib/components/avatargroup/style/AvatarGroup.css.d.ts +2 -0
  7. package/lib/components/avatargroup/style/index.d.ts +1 -0
  8. package/lib/components/avatargroup/symbol.d.ts +13 -0
  9. package/lib/components/badge/Badge.vue.d.ts +30 -0
  10. package/lib/components/badge/style/Badge.css.d.ts +4 -0
  11. package/lib/components/badge/style/index.d.ts +1 -0
  12. package/lib/components/breadcrumb/Breadcrumb.vue.d.ts +12 -3
  13. package/lib/components/{breadcrumbitem → breadcrumb}/BreadcrumbItem.vue.d.ts +11 -0
  14. package/lib/components/breadcrumb/style/Breadcrumb.css.d.ts +4 -0
  15. package/lib/components/breadcrumb/style/index.d.ts +1 -0
  16. package/lib/components/breadcrumb/symbol.d.ts +13 -0
  17. package/lib/components/button/Button.vue.d.ts +39 -28
  18. package/lib/components/button/style/Button.css.d.ts +24 -0
  19. package/lib/components/button/style/index.d.ts +1 -0
  20. package/lib/components/buttongroup/ButtonGroup.vue.d.ts +2 -13
  21. package/lib/components/buttongroup/style/ButtonGroup.css.d.ts +2 -0
  22. package/lib/components/buttongroup/style/index.d.ts +1 -0
  23. package/lib/components/buttongroup/symbol.d.ts +6 -0
  24. package/lib/components/checkbox/Checkbox.vue.d.ts +17 -20
  25. package/lib/components/checkbox/style/Checkbox.css.d.ts +16 -0
  26. package/lib/components/checkbox/style/index.d.ts +1 -0
  27. package/lib/components/colorpicker/ColorPicker.vue.d.ts +75 -0
  28. package/lib/components/colorpicker/style/ColorPicker.css.d.ts +9 -0
  29. package/lib/components/colorpicker/style/index.d.ts +1 -0
  30. package/lib/components/colorpicker/utils.d.ts +16 -0
  31. package/lib/components/dropdown/Dropdown.vue.d.ts +5 -4
  32. package/lib/components/dropdown/DropdownItem.vue.d.ts +12 -5
  33. package/lib/components/dropdown/DropdownList.vue.d.ts +4 -1
  34. package/lib/components/dropdown/style/Dropdown.css.d.ts +5 -0
  35. package/lib/components/dropdown/style/index.d.ts +1 -0
  36. package/lib/components/dropdown/symbol.d.ts +6 -0
  37. package/lib/components/form/Form.vue.d.ts +12 -1
  38. package/lib/components/form/style/Form.css.d.ts +4 -0
  39. package/lib/components/form/style/index.d.ts +2 -0
  40. package/lib/components/index.d.ts +10 -1
  41. package/lib/components/input/Input.vue.d.ts +35 -19
  42. package/lib/components/input/style/Input.css.d.ts +23 -0
  43. package/lib/components/input/style/index.d.ts +1 -0
  44. package/lib/components/link/Link.vue.d.ts +2 -2
  45. package/lib/components/messageprovider/Message.vue.d.ts +13 -1
  46. package/lib/components/messageprovider/MessageProvider.vue.d.ts +6 -5
  47. package/lib/components/messageprovider/style/Message.css.d.ts +12 -0
  48. package/lib/components/messageprovider/style/index.d.ts +1 -0
  49. package/lib/components/messageprovider/types.d.ts +2 -1
  50. package/lib/components/modal/Modal.vue.d.ts +52 -0
  51. package/lib/components/modal/style/Modal.css.d.ts +21 -0
  52. package/lib/components/modal/style/index.d.ts +1 -0
  53. package/lib/components/radio/Radio.vue.d.ts +85 -0
  54. package/lib/components/radio/style/Checkbox.css.d.ts +16 -0
  55. package/lib/components/radio/style/index.d.ts +1 -0
  56. package/lib/components/radiobutton/RadioButton.vue.d.ts +98 -0
  57. package/lib/components/radiobutton/style/RadioButton.css.d.ts +14 -0
  58. package/lib/components/radiobutton/style/index.d.ts +1 -0
  59. package/lib/components/radiobuttongroup/RadioButtonGroup.vue.d.ts +48 -0
  60. package/lib/components/radiobuttongroup/style/RadioButtonGroup.css.d.ts +3 -0
  61. package/lib/components/radiobuttongroup/style/index.d.ts +1 -0
  62. package/lib/components/radiobuttongroup/symbol.d.ts +9 -0
  63. package/lib/components/select/Select.vue.d.ts +22 -13
  64. package/lib/components/select/style/Select.css.d.ts +30 -0
  65. package/lib/components/select/style/index.d.ts +1 -0
  66. package/lib/components/skeleton/Skeleton.vue.d.ts +15 -21
  67. package/lib/components/skeleton/style/Skeleton.css.d.ts +8 -0
  68. package/lib/components/skeleton/style/index.d.ts +2 -0
  69. package/lib/components/slider/Slider.vue.d.ts +32 -0
  70. package/lib/components/slider/style/Slider.css.d.ts +4 -0
  71. package/lib/components/slider/style/index.d.ts +1 -0
  72. package/lib/components/tab/TabGroup.vue.d.ts +1 -1
  73. package/lib/components/table/Table.vue.d.ts +1 -1
  74. package/lib/components/tag/Tag.vue.d.ts +44 -0
  75. package/lib/components/tag/style/Tag.css.d.ts +11 -0
  76. package/lib/components/tag/style/index.d.ts +1 -0
  77. package/lib/components/tooltip/Tooltip.vue.d.ts +17 -2
  78. package/lib/components/tooltip/style/Tooltip.css.d.ts +6 -0
  79. package/lib/components/tooltip/style/index.d.ts +1 -0
  80. package/lib/components/virtualscroll/VirtualScroll.vue.d.ts +46 -16
  81. package/lib/components/virtualscroll/style/VirtualScroll.css.d.ts +1 -0
  82. package/lib/components/virtualscroll/style/index.d.ts +1 -0
  83. package/lib/composables/useInput.d.ts +1 -1
  84. package/lib/composables/useInteractive.d.ts +15 -0
  85. package/lib/composables/useZIndex.d.ts +8 -0
  86. package/lib/index.cjs.js +8 -2
  87. package/lib/index.d.ts +0 -1
  88. package/lib/index.es.js +3699 -1694
  89. package/lib/style.css +1 -1
  90. package/lib/styles/theme.css.d.ts +147 -0
  91. package/lib/styles/typography.css.d.ts +22 -0
  92. package/lib/types/props.d.ts +1 -0
  93. package/package.json +34 -26
  94. package/src/__storybook__/argTypes.ts +19 -1
  95. package/src/components/avatar/Avatar.vue +33 -26
  96. package/src/components/avatar/examples/index.stories.ts +1 -1
  97. package/src/components/avatar/style/Avatar.css.ts +92 -0
  98. package/src/components/avatar/style/index.ts +1 -0
  99. package/src/components/avatargroup/AvatarGroup.vue +71 -32
  100. package/src/components/avatargroup/examples/basic.vue +33 -7
  101. package/src/components/avatargroup/examples/index.stories.ts +4 -8
  102. package/src/components/avatargroup/style/AvatarGroup.css.ts +21 -0
  103. package/src/components/avatargroup/style/index.ts +1 -0
  104. package/src/components/avatargroup/symbol.ts +17 -0
  105. package/src/components/badge/Badge.css +128 -0
  106. package/src/components/badge/Badge.vue +43 -0
  107. package/src/components/badge/examples/basic.vue +10 -0
  108. package/src/components/badge/examples/index.stories.ts +21 -0
  109. package/src/components/badge/examples/index.ts +1 -0
  110. package/src/components/badge/style/Badge.css.ts +124 -0
  111. package/src/components/badge/style/index.ts +1 -0
  112. package/src/components/breadcrumb/Breadcrumb.vue +22 -15
  113. package/src/components/breadcrumb/BreadcrumbItem.vue +73 -0
  114. package/src/components/breadcrumb/examples/basic.vue +5 -7
  115. package/src/components/breadcrumb/examples/index.stories.ts +2 -2
  116. package/src/components/breadcrumb/style/Breadcrumb.css.ts +40 -0
  117. package/src/components/breadcrumb/style/index.ts +1 -0
  118. package/src/components/breadcrumb/symbol.ts +17 -0
  119. package/src/components/button/Button.vue +194 -107
  120. package/src/components/button/examples/icon-left.vue +12 -0
  121. package/src/components/button/examples/icon.vue +6 -7
  122. package/src/components/button/examples/index.stories.ts +9 -7
  123. package/src/components/button/examples/index.ts +3 -2
  124. package/src/components/button/examples/variants-secondary.vue +8 -0
  125. package/src/components/button/examples/variants.vue +8 -0
  126. package/src/components/button/style/Button.css.ts +585 -0
  127. package/src/components/button/style/index.ts +1 -0
  128. package/src/components/buttongroup/ButtonGroup.vue +36 -47
  129. package/src/components/buttongroup/examples/basic.vue +2 -2
  130. package/src/components/buttongroup/examples/icon-group.vue +22 -0
  131. package/src/components/buttongroup/examples/index.stories.ts +4 -2
  132. package/src/components/buttongroup/examples/index.ts +1 -0
  133. package/src/components/buttongroup/style/ButtonGroup.css.ts +40 -0
  134. package/src/components/buttongroup/style/index.ts +1 -0
  135. package/src/components/buttongroup/symbol.ts +8 -0
  136. package/src/components/checkbox/Checkbox.vue +70 -54
  137. package/src/components/checkbox/examples/index.stories.ts +1 -1
  138. package/src/components/checkbox/style/Checkbox.css.ts +127 -0
  139. package/src/components/checkbox/style/index.ts +1 -0
  140. package/src/components/colorpicker/ColorPicker.vue +283 -0
  141. package/src/components/colorpicker/examples/basic.vue +3 -0
  142. package/src/components/colorpicker/examples/index.stories.ts +17 -0
  143. package/src/components/colorpicker/examples/index.ts +1 -0
  144. package/src/components/colorpicker/style/ColorPicker.css.ts +97 -0
  145. package/src/components/colorpicker/style/index.ts +1 -0
  146. package/src/components/colorpicker/utils.ts +188 -0
  147. package/src/components/dropdown/Dropdown.vue +45 -24
  148. package/src/components/dropdown/DropdownItem.vue +121 -118
  149. package/src/components/dropdown/DropdownList.vue +3 -3
  150. package/src/components/dropdown/DropdownWrapper.vue +2 -1
  151. package/src/components/dropdown/examples/custom.vue +13 -0
  152. package/src/components/dropdown/examples/index.stories.ts +4 -2
  153. package/src/components/dropdown/examples/index.ts +1 -0
  154. package/src/components/dropdown/style/Dropdown.css.ts +48 -0
  155. package/src/components/dropdown/style/index.ts +1 -0
  156. package/src/components/dropdown/symbol.ts +8 -0
  157. package/src/components/form/Form.vue +12 -3
  158. package/src/components/form/examples/basic.vue +4 -2
  159. package/src/components/form/examples/index.stories.ts +4 -2
  160. package/src/components/form/style/Form.css.ts +23 -0
  161. package/src/components/form/style/index.ts +2 -0
  162. package/src/components/image/examples/index.stories.ts +1 -1
  163. package/src/components/index.ts +10 -2
  164. package/src/components/input/Input.vue +84 -42
  165. package/src/components/input/examples/basic.vue +2 -1
  166. package/src/components/input/examples/index.stories.ts +1 -1
  167. package/src/components/input/examples/prefix.vue +4 -2
  168. package/src/components/input/examples/suffix.vue +4 -2
  169. package/src/components/input/style/Input.css.ts +221 -0
  170. package/src/components/input/style/index.ts +1 -0
  171. package/src/components/link/examples/index.stories.ts +1 -1
  172. package/src/components/messageprovider/Message.vue +52 -5
  173. package/src/components/messageprovider/MessageProvider.css +0 -13
  174. package/src/components/messageprovider/MessageProvider.vue +18 -16
  175. package/src/components/messageprovider/examples/basic.vue +56 -5
  176. package/src/components/messageprovider/examples/index.stories.ts +0 -1
  177. package/src/components/messageprovider/examples/index.ts +1 -0
  178. package/src/components/messageprovider/examples/update.vue +34 -0
  179. package/src/components/messageprovider/examples/wrapper.vue +1 -1
  180. package/src/components/messageprovider/style/Message.css.ts +109 -0
  181. package/src/components/messageprovider/style/index.ts +1 -0
  182. package/src/components/messageprovider/types.ts +9 -1
  183. package/src/components/modal/Modal.vue +126 -0
  184. package/src/components/modal/examples/basic.vue +40 -0
  185. package/src/components/modal/examples/index.stories.ts +20 -0
  186. package/src/components/modal/examples/index.ts +2 -0
  187. package/src/components/modal/examples/modal-form.vue +99 -0
  188. package/src/components/modal/style/Modal.css.ts +257 -0
  189. package/src/components/modal/style/index.ts +1 -0
  190. package/src/components/radio/Checkbox.css +185 -0
  191. package/src/components/radio/Radio.vue +137 -0
  192. package/src/components/radio/examples/basic.vue +9 -0
  193. package/src/components/radio/examples/index.stories.ts +19 -0
  194. package/src/components/radio/examples/index.ts +2 -0
  195. package/src/components/radio/style/Checkbox.css.ts +132 -0
  196. package/src/components/radio/style/index.ts +1 -0
  197. package/src/components/radiobutton/RadioButton.vue +131 -0
  198. package/src/components/radiobutton/style/RadioButton.css.ts +185 -0
  199. package/src/components/radiobutton/style/index.ts +1 -0
  200. package/src/components/radiobuttongroup/RadioButtonGroup.vue +75 -0
  201. package/src/components/radiobuttongroup/examples/basic.vue +17 -0
  202. package/src/components/radiobuttongroup/examples/index.stories.ts +22 -0
  203. package/src/components/radiobuttongroup/examples/index.ts +2 -0
  204. package/src/components/radiobuttongroup/style/RadioButtonGroup.css.ts +37 -0
  205. package/src/components/radiobuttongroup/style/index.ts +1 -0
  206. package/src/components/radiobuttongroup/symbol.ts +11 -0
  207. package/src/components/select/Select.css +0 -226
  208. package/src/components/select/Select.vue +116 -48
  209. package/src/components/select/examples/index.stories.ts +1 -1
  210. package/src/components/select/examples/multiple.vue +1 -2
  211. package/src/components/select/style/Select.css.ts +254 -0
  212. package/src/components/select/style/index.ts +1 -0
  213. package/src/components/skeleton/Skeleton.vue +55 -47
  214. package/src/components/skeleton/examples/index.stories.ts +1 -8
  215. package/src/components/skeleton/style/Skeleton.css.ts +57 -0
  216. package/src/components/skeleton/style/index.ts +2 -0
  217. package/src/components/slider/Slider.vue +76 -0
  218. package/src/components/slider/style/Slider.css.ts +43 -0
  219. package/src/components/slider/style/index.ts +1 -0
  220. package/src/components/tab/examples/index.stories.ts +1 -1
  221. package/src/components/table/examples/index.stories.ts +1 -1
  222. package/src/components/tag/Tag.css +0 -0
  223. package/src/components/tag/Tag.vue +66 -0
  224. package/src/components/tag/examples/basic.vue +5 -0
  225. package/src/components/tag/examples/index.stories.ts +22 -0
  226. package/src/components/tag/examples/index.ts +1 -0
  227. package/src/components/tag/style/Tag.css.ts +79 -0
  228. package/src/components/tag/style/index.ts +1 -0
  229. package/src/components/tooltip/Tooltip.css +0 -6
  230. package/src/components/tooltip/Tooltip.vue +53 -22
  231. package/src/components/tooltip/examples/basic.vue +2 -5
  232. package/src/components/tooltip/examples/index.stories.ts +1 -1
  233. package/src/components/tooltip/style/Tooltip.css.ts +48 -0
  234. package/src/components/tooltip/style/index.ts +1 -0
  235. package/src/components/virtualscroll/VirtualScroll.vue +159 -53
  236. package/src/components/virtualscroll/examples/basic.vue +21 -27
  237. package/src/components/virtualscroll/examples/index.stories.ts +2 -18
  238. package/src/components/virtualscroll/style/VirtualScroll.css.ts +18 -0
  239. package/src/components/virtualscroll/style/index.ts +1 -0
  240. package/src/composables/useInput.ts +2 -2
  241. package/src/composables/useInteractive.ts +20 -0
  242. package/src/composables/usePopper.ts +1 -1
  243. package/src/composables/useZIndex.ts +31 -0
  244. package/src/css/components.css +4 -3
  245. package/src/css/normalize.css +0 -379
  246. package/src/css/variables.css +2 -2
  247. package/src/examples/cards/cards.stories.ts +9 -0
  248. package/src/examples/cards/sidebar.vue +263 -0
  249. package/src/index.ts +1 -1
  250. package/src/styles/theme.css.ts +149 -0
  251. package/src/styles/typography.css.ts +91 -0
  252. package/src/types/props.ts +2 -0
  253. package/lib/components/breadcrumbitem/index.d.ts +0 -1
  254. package/src/components/avatar/Avatar.css +0 -69
  255. package/src/components/breadcrumbitem/BreadcrumbItem.vue +0 -66
  256. package/src/components/breadcrumbitem/index.ts +0 -1
  257. package/src/components/button/examples/colors-secondary.vue +0 -8
  258. package/src/components/button/examples/colors.vue +0 -8
  259. package/src/components/dropdown/Dropdown.css +0 -68
  260. /package/src/components/button/{Button.css → Button-old.css} +0 -0
@@ -1,226 +0,0 @@
1
- .m-select__container {
2
- position: relative;
3
- display: flex;
4
- flex-direction: column;
5
- width: 100%;
6
- }
7
-
8
- .m-select__container:focus {
9
- outline: none;
10
- }
11
-
12
- .m-select {
13
- --select-height: 40px;
14
- --select-padding: 0 8px;
15
- --select-font-size: 15px;
16
- --select-border-radius: 4px;
17
- --select-clear-size: 1.2rem;
18
- --select-background-color: var(--white);
19
- --select-border-color: var(--gray-200);
20
-
21
- position: relative;
22
- display: inline-flex;
23
- align-items: center;
24
- height: var(--select-height);
25
- font-size: var(--select-font-size);
26
- background-color: var(--select-background-color);
27
- border: 1px solid var(--select-border-color);
28
- box-shadow: none;
29
- border-radius: var(--select-border-radius);
30
- outline: 0;
31
- cursor: text;
32
- width: 100%;
33
- transition: color .3s cubic-bezier(0.4, 0, 0.2, 1), background-color .3s cubic-bezier(0.4, 0, 0.2, 1), border-color .3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow .3s cubic-bezier(0.4, 0, 0.2, 1);
34
- }
35
-
36
- .m-select:not(.m-select--disabled):not(.m-select--focused):hover {
37
- --select-border-color: var(--gray-400);
38
- }
39
-
40
- .m-select:not(.m-select--disabled):focus,
41
- .m-select:not(.m-select--disabled):focus-within,
42
- .m-select:not(.m-select--disabled).m-select--focused {
43
- --select-border-color: var(--blue);
44
- box-shadow: 0 0 0 2px var(--blue-outline);
45
- outline: none;
46
- }
47
-
48
- .m-select.m-select--disabled {
49
- --select-border-color: var(--gray-300);
50
- --select-background-color: var(--gray-100);
51
- opacity: 0.6;
52
- cursor: not-allowed;
53
- }
54
-
55
- .m-select__clearable {
56
- display: flex;
57
- align-items: center;
58
- justify-content: center;
59
- padding: 0 6px;
60
- }
61
-
62
- .m-select .m-select__clearable i.m-icon--close {
63
- cursor: pointer;
64
- width: var(--select-clear-size);
65
- height: var(--select-clear-size);
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
69
- border-radius: 100%;
70
- color: var(--gray-500);
71
- background-color: transparent;
72
- transition: background-color .125s cubic-bezier(0.4, 0, 0.2, 1);
73
- }
74
-
75
- .m-select .m-select__clearable i.m-icon--close:hover {
76
- color: var(--gray-500);
77
- background-color: var(--gray-150);
78
- }
79
-
80
- .m-select i.m-icon--close::before {
81
- --close-icon-size: 16px;
82
- background-color: currentColor;
83
- content: "";
84
- width: var(--close-icon-size);
85
- height: var(--close-icon-size);
86
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='w-5 h-5'%3E%3Cpath d='M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z' /%3E%3C/svg%3E%0A");
87
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='currentColor' class='w-5 h-5'%3E%3Cpath d='M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z' /%3E%3C/svg%3E%0A");
88
- -webkit-mask-position: center center;
89
- mask-position: center center;
90
- -webkit-mask-repeat: no-repeat;
91
- mask-repeat: no-repeat;
92
- -webkit-mask-size: var(--close-icon-size) var(--close-icon-size);
93
- mask-size: var(--close-icon-size) var(--close-icon-size);
94
- }
95
-
96
- .m-select--xs {
97
- --select-height: 32px;
98
- --select-padding: 0 8px;
99
- --select-font-size: 13px;
100
- --select-border-radius: 4px;
101
- --select-clear-size: 1.2rem;
102
- }
103
-
104
- .m-select--sm {
105
- --select-height: 36px;
106
- --select-padding: 0 8px;
107
- --select-font-size: 14px;
108
- --select-border-radius: 4px;
109
- --select-clear-size: 1.2rem;
110
- }
111
-
112
- .m-select--md {
113
- --select-height: 40px;
114
- --select-padding: 0 8px;
115
- --select-font-size: 15px;
116
- --select-border-radius: 4px;
117
- --select-clear-size: 1.2rem;
118
- }
119
-
120
- .m-select--lg {
121
- --select-height: 42px;
122
- --select-padding: 0 8px;
123
- --select-font-size: 16px;
124
- --select-border-radius: 4px;
125
- --select-clear-size: 1.2rem;
126
- }
127
-
128
- .m-select--xl {
129
- --select-height: 46px;
130
- --select-padding: 0 8px;
131
- --select-font-size: 18px;
132
- --select-border-radius: 6px;
133
- --select-clear-size: 1.2rem;
134
- }
135
-
136
- .m-select__label {
137
- margin-bottom: 5px;
138
- color: var(--gray-600);
139
- font-size: 15px;
140
- font-weight: 600;
141
- }
142
-
143
- .m-select__input {
144
- padding: var(--select-padding);
145
- font-size: 15px;
146
- color: var(--gray-600);
147
- }
148
-
149
- .m-select__help {
150
- margin-top: 4px;
151
- color: var(--gray-500);
152
- font-size: 15px;
153
- font-weight: 400;
154
- }
155
-
156
- .m-select__error {
157
- margin: 4px 0 8px 0;
158
- color: var(--red);
159
- font-size: 15px;
160
- font-weight: 400;
161
- }
162
-
163
- .m-form .m-select__form {
164
- margin-bottom: 16px;
165
- }
166
-
167
- .m-form .m-select__form .m-select__error {
168
- margin: 4px 0 0 0;
169
- }
170
-
171
- .m-select__dropdown {
172
- z-index: 100;
173
- max-height: 400px;
174
- min-width: 200px;
175
- overflow-y: auto;
176
- border-radius: 4px;
177
- background-color: var(--white);
178
- box-shadow: 0 0 0 1px var(--gray-200), 0 4px 8px 0 rgba(0, 0, 0, 0.1);
179
- display: flex;
180
- flex-direction: column;
181
- }
182
-
183
- .m-select__dropdown[data-popper-placement^="bottom-"] {
184
- margin-top: 5px!important;
185
- }
186
-
187
- .m-select__dropdown[data-popper-placement^="top-"] {
188
- margin-bottom: 5px!important;
189
- }
190
-
191
- .m-select__search {
192
- position: sticky;
193
- top: 0;
194
- z-index: 1;
195
- background-color: var(--white);
196
- padding: 6px 6px 0;
197
- }
198
-
199
- .m-select__options {
200
- padding: 4px 0;
201
- }
202
-
203
- .m-select__option {
204
- display: flex;
205
- align-items: center;
206
- justify-content: space-between;
207
- padding: 8px 8px;
208
- margin: 0 4px;
209
- font-size: 15px;
210
- color: var(--gray-600);
211
- cursor: pointer;
212
- transition: background-color .125s cubic-bezier(0.4, 0, 0.2, 1);
213
- border-radius: 4px;
214
- }
215
-
216
- .m-select__option--selected {
217
- color: var(--blue)!important;
218
- }
219
-
220
- .m-select__option--focused {
221
- background-color: var(--gray-100);
222
- }
223
-
224
- .m-select__placeholder-text {
225
- color: var(--gray-500);
226
- }
@@ -1,43 +1,50 @@
1
1
  <template>
2
- <div :class="containerComputedClasses" ref="selectRef" tabindex="0">
3
- <label v-if="label" :for="id" class="m-select__label" v-on="listeners" :id="`${id}-label`">
2
+ <div ref="selectRef" tabindex="0" @focus="focusSelect" @blur="open = false" style="outline: none">
3
+ <label v-if="label" :for="id" :class="style.label" :id="`${id}-label`">
4
4
  {{ label }}
5
5
  </label>
6
+ <div v-if="description" :class="style.description">
7
+ {{ description }}
8
+ </div>
6
9
 
7
- <div :class="selectComputedClasses" :id="id" ref="container" @click="openSelect" :aria-disabled="disabled ? 'true' : 'false'" :aria-labelledby="`${id}-label`">
10
+ <div :class="style.wrapper" v-on="inputListeners" :id="id" ref="container" @click="openSelect" :aria-disabled="disabled ? 'true' : 'false'" :aria-labelledby="`${id}-label`" tabindex="0">
8
11
  <div class="m-select__wrapper">
9
- <div class="m-select__input">
10
- <div class="m-select__input-wrapper">
11
- <template v-if="multiple && Array.isArray(selected) && selected.length > 0">
12
- <span
13
- v-for="value in selected"
14
- :key="value"
15
- class="m-select__tag">
16
- {{ getSelectedLabel(value) }}
17
- </span>
18
- </template>
19
- <template v-else-if="!multiple && selected">
20
- {{ getSelectedLabel(selected) }}
21
- </template>
22
- <template v-else>
23
- <span class="m-select__placeholder-text">{{ placeholder }}</span>
24
- </template>
25
- </div>
12
+
13
+ <div :class="selectComputedClasses">
14
+ <template v-if="multiple && Array.isArray(selected) && selected.length > 0">
15
+ <MTag
16
+ v-for="value in selected"
17
+ :key="value"
18
+ :closeable="true"
19
+ @close="removeSelected(value)"
20
+ :size="size"
21
+ >
22
+ {{ getSelectedLabel(value) }}
23
+ </MTag>
24
+ </template>
25
+ <template v-else-if="!multiple && selected">
26
+ {{ getSelectedLabel(selected) }}
27
+ </template>
28
+ <template v-else>
29
+ <div :class="style.placeholder">{{ placeholder }}</div>
30
+ </template>
26
31
  </div>
32
+
27
33
  <Teleport :to="'body'">
28
34
  <Transition :name="transitionName">
29
- <div class="m-select__dropdown" v-if="open" ref="popper" :style="computedConsistentWidth" :aria-hidden="open ? 'false' : 'true'">
30
- <div v-if="searchable" class="m-select__search">
35
+ <div :class="style.menu" v-if="isOpen" ref="popper" :style="computedConsistentWidth" :aria-hidden="isOpen ? 'false' : 'true'">
36
+ <div v-if="searchable" :class="style.search">
31
37
  <MInput v-model="search" placeholder="Search" size="sm" ref="searchRef" />
32
38
  </div>
33
- <div class="m-select__options">
34
- <div v-for="option, index in computedOptions" :key="index" ref="optionsRef"
35
- class="m-select__option" :class="{
36
- 'm-select__option--selected': option.active,
37
- 'm-select__option--focused': selectedIndex === index
39
+ <div :class="style.options">
40
+ <div v-for="(option, index) in computedOptions" :key="index" ref="optionsRef"
41
+ :class="{
42
+ [style.option]: true,
43
+ [style.optionSelected]: option.active,
44
+ [style.optionFocused]: selectedIndex === index
38
45
  }"
39
46
  @click="option.onClick"
40
- @mouseover="selectedIndex = index">
47
+ @hover="selectedIndex = index">
41
48
  {{ option.label }}
42
49
  </div>
43
50
  </div>
@@ -46,9 +53,9 @@
46
53
  </Teleport>
47
54
  </div>
48
55
  </div>
49
- <p v-if="inputError" class="m-select__error">
56
+ <div v-if="inputError" :class="style.errorMessage">
50
57
  {{ inputError }}
51
- </p>
58
+ </div>
52
59
  </div>
53
60
  </template>
54
61
 
@@ -64,15 +71,18 @@ import {
64
71
  ref,
65
72
  watch,
66
73
  watchEffect,
67
- type PropType
74
+ type PropType, defineExpose
68
75
  } from "vue";
69
- import { MInput } from "..";
76
+ import { MInput, MTag } from "..";
77
+ import * as style from "./style";
78
+ import {useInteractive} from "../../composables/useInteractive";
70
79
 
71
80
  export default defineComponent({
72
81
  name: 'MSelect',
73
82
  emits: useInput.emits(),
74
83
  props: {
75
84
  ...useInput.props(),
85
+ ...useInteractive.props(),
76
86
  label: {
77
87
  type: String
78
88
  },
@@ -96,7 +106,7 @@ export default defineComponent({
96
106
  type: String as PropType<Size>,
97
107
  default: 'md',
98
108
  },
99
- help: {
109
+ description: {
100
110
  type: String,
101
111
  default: ''
102
112
  },
@@ -124,13 +134,20 @@ export default defineComponent({
124
134
  type: Boolean,
125
135
  default: false
126
136
  },
137
+ error: {
138
+ type: String,
139
+ },
140
+ },
141
+ components: {
142
+ MInput,
143
+ MTag
127
144
  },
128
145
  setup(props, { emit }) {
129
- const container = ref<HTMLDivElement>();
130
- const wrapper = ref<HTMLDivElement>();
131
- const optionsRef = ref<HTMLDivElement[]>();
132
- const searchRef = ref<HTMLDivElement>();
133
- const selectRef = ref<HTMLDivElement>();
146
+ const container = ref<HTMLElement|null>(null);
147
+ const wrapper = ref<HTMLElement>();
148
+ const optionsRef = ref<HTMLElement[]>();
149
+ const searchRef = ref<HTMLElement>();
150
+ const selectRef = ref<HTMLElement>();
134
151
  const selectedIndex = ref<number | undefined>(0);
135
152
  const open = ref<boolean>(false);
136
153
  const search = ref<string>('');
@@ -139,13 +156,12 @@ export default defineComponent({
139
156
  const width = ref<number>(0);
140
157
  const keyboardNavigation = ref<boolean>(false);
141
158
 
142
- const focus = () => { };
143
-
159
+ const { focus, blur } = useInteractive(container);
144
160
  // TODO: Add debounce on keyboard movement (hover flicks it back up)
145
161
  const {
146
162
  id,
147
163
  insideForm,
148
- listeners,
164
+ inputListeners,
149
165
  formError,
150
166
  formDisabled,
151
167
  formLoading
@@ -155,7 +171,8 @@ export default defineComponent({
155
171
  placement,
156
172
  transfer,
157
173
  reference: container,
158
- wrapper
174
+ wrapper,
175
+ offset: [0, 5]
159
176
  });
160
177
 
161
178
  const disabled = computed(() => formDisabled || props.disabled);
@@ -217,14 +234,21 @@ export default defineComponent({
217
234
  } else {
218
235
  active = selected.value === value;
219
236
  }
220
-
237
+
221
238
  return {
222
239
  value: value,
223
240
  label: option[props.optionLabel],
224
241
  active: active,
225
242
  onClick: () => handleOptionClick(value)
226
243
  }
227
- })
244
+ }).filter((option) => {
245
+ if (props.multiple && Array.isArray(selected.value)) {
246
+ // Filter out selected options
247
+ return !selected.value.includes(option.value);
248
+ }
249
+
250
+ return true;
251
+ });
228
252
  }
229
253
 
230
254
  return props.options.map((option) => {
@@ -250,7 +274,14 @@ export default defineComponent({
250
274
  active: active,
251
275
  onClick: () => handleOptionClick(value)
252
276
  }
253
- })
277
+ }).filter((option) => {
278
+ if (props.multiple && Array.isArray(selected.value)) {
279
+ // Filter out selected options
280
+ return !selected.value.includes(option.value);
281
+ }
282
+
283
+ return true;
284
+ });
254
285
  });
255
286
 
256
287
  function openSelect() {
@@ -310,6 +341,20 @@ export default defineComponent({
310
341
  }
311
342
  }
312
343
 
344
+ function removeSelected(value: string | number) {
345
+ if (!props.multiple) {
346
+ return;
347
+ }
348
+
349
+ if (Array.isArray(selected.value)) {
350
+ const index = selected.value.indexOf(value);
351
+
352
+ if (index !== -1) {
353
+ selected.value.splice(index, 1);
354
+ }
355
+ }
356
+ }
357
+
313
358
  function handleKeyDown(e: Event) {
314
359
  if (computedOptions.value.length === 0) {
315
360
  return;
@@ -385,9 +430,10 @@ export default defineComponent({
385
430
 
386
431
  const selectComputedClasses = computed(() => {
387
432
  return [
388
- 'm-select',
433
+ style.base,
389
434
  {
390
- [`m-select--${props.size}`]: props.size,
435
+ [style.selectedTags]: props.multiple,
436
+ // [`m-select--${props.size}`]: props.size,
391
437
  'm-select--disabled': disabled.value || loading.value,
392
438
  'm-select--focused': open.value,
393
439
  'm-select--multiple': props.multiple,
@@ -445,14 +491,34 @@ export default defineComponent({
445
491
  return formError.value || props.error;
446
492
  });
447
493
 
494
+ const isOpen = computed(() => {
495
+ if (props.multiple && computedOptions.value.length == 0 && !search.value) {
496
+ return false;
497
+ }
498
+ return open.value;
499
+ });
500
+
501
+ const focusSelect = () => {
502
+ if (selectRef.value) {
503
+ openSelect();
504
+ }
505
+ }
506
+
507
+ defineExpose({
508
+ focus,
509
+ blur,
510
+ })
511
+
448
512
  return {
449
513
  container,
450
514
  optionsRef,
451
515
  searchRef,
452
516
  selectRef,
453
517
  popper,
518
+ focusSelect,
454
519
 
455
520
  id,
521
+ isOpen,
456
522
  open,
457
523
  selected,
458
524
  computedOptions,
@@ -465,9 +531,11 @@ export default defineComponent({
465
531
 
466
532
  getSelectedLabel,
467
533
  openSelect,
534
+ removeSelected,
468
535
  inputError,
469
536
  transitionName,
470
- listeners
537
+ inputListeners,
538
+ style
471
539
  }
472
540
  }
473
541
  });
@@ -7,7 +7,7 @@ import {
7
7
 
8
8
  import {
9
9
  createStory, sizeArgType
10
- } from "@/__storybook__";
10
+ } from "../../../__storybook__";
11
11
 
12
12
  export default {
13
13
  component: MSelect,
@@ -7,13 +7,12 @@
7
7
  multiple
8
8
  searchable
9
9
  />
10
- {{ value }}
11
10
  </template>
12
11
 
13
12
  <script lang="ts" setup>
14
13
  import { ref } from "vue";
15
14
 
16
- const options = Array.from({ length: 50 }, (_, i) => ({
15
+ const options = Array.from({ length: 5 }, (_, i) => ({
17
16
  id: i,
18
17
  name: `Option ${i+1}`
19
18
  }));