@teammodlr/ui-kit 2.0.29 → 2.0.31

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 (400) hide show
  1. package/env.d.ts +1 -1
  2. package/lib/__storybook__/argTypes.d.ts +40 -40
  3. package/lib/__storybook__/createStory.d.ts +8 -8
  4. package/lib/__storybook__/index.d.ts +2 -2
  5. package/lib/components/avatar/Avatar.vue.d.ts +56 -56
  6. package/lib/components/avatar/style/Avatar.css.d.ts +9 -9
  7. package/lib/components/avatar/style/index.d.ts +1 -1
  8. package/lib/components/avatargroup/AvatarGroup.vue.d.ts +49 -49
  9. package/lib/components/avatargroup/style/AvatarGroup.css.d.ts +2 -2
  10. package/lib/components/avatargroup/style/index.d.ts +1 -1
  11. package/lib/components/avatargroup/symbol.d.ts +13 -13
  12. package/lib/components/badge/Badge.vue.d.ts +30 -30
  13. package/lib/components/badge/style/Badge.css.d.ts +4 -4
  14. package/lib/components/badge/style/index.d.ts +1 -1
  15. package/lib/components/breadcrumb/Breadcrumb.vue.d.ts +34 -34
  16. package/lib/components/breadcrumb/BreadcrumbItem.vue.d.ts +29 -29
  17. package/lib/components/breadcrumb/style/Breadcrumb.css.d.ts +4 -4
  18. package/lib/components/breadcrumb/style/index.d.ts +1 -1
  19. package/lib/components/breadcrumb/symbol.d.ts +13 -13
  20. package/lib/components/button/Button.vue.d.ts +141 -141
  21. package/lib/components/button/style/Button.css.d.ts +25 -25
  22. package/lib/components/button/style/index.d.ts +1 -1
  23. package/lib/components/buttongroup/ButtonGroup.vue.d.ts +18 -18
  24. package/lib/components/buttongroup/style/ButtonGroup.css.d.ts +2 -2
  25. package/lib/components/buttongroup/style/index.d.ts +1 -1
  26. package/lib/components/buttongroup/symbol.d.ts +6 -6
  27. package/lib/components/checkbox/Checkbox.vue.d.ts +94 -94
  28. package/lib/components/checkbox/style/Checkbox.css.d.ts +16 -16
  29. package/lib/components/checkbox/style/index.d.ts +1 -1
  30. package/lib/components/colorpicker/ColorPicker.vue.d.ts +83 -77
  31. package/lib/components/colorpicker/style/ColorPicker.css.d.ts +10 -10
  32. package/lib/components/colorpicker/style/index.d.ts +1 -1
  33. package/lib/components/colorpicker/utils.d.ts +16 -16
  34. package/lib/components/dropdown/Dropdown.vue.d.ts +128 -122
  35. package/lib/components/dropdown/DropdownItem.vue.d.ts +78 -78
  36. package/lib/components/dropdown/DropdownList.vue.d.ts +5 -5
  37. package/lib/components/dropdown/DropdownSeperator.vue.d.ts +4 -4
  38. package/lib/components/dropdown/DropdownWrapper.vue.d.ts +2 -2
  39. package/lib/components/dropdown/hooks.d.ts +2 -2
  40. package/lib/components/dropdown/style/Dropdown.css.d.ts +6 -6
  41. package/lib/components/dropdown/style/index.d.ts +1 -1
  42. package/lib/components/dropdown/symbol.d.ts +6 -6
  43. package/lib/components/form/Form.vue.d.ts +75 -75
  44. package/lib/components/form/style/Form.css.d.ts +4 -4
  45. package/lib/components/form/style/index.d.ts +2 -2
  46. package/lib/components/form/symbol.d.ts +9 -9
  47. package/lib/components/image/Image.vue.d.ts +50 -50
  48. package/lib/components/index.d.ts +41 -41
  49. package/lib/components/input/Input.vue.d.ts +142 -142
  50. package/lib/components/input/style/Input.css.d.ts +23 -23
  51. package/lib/components/input/style/index.d.ts +1 -1
  52. package/lib/components/link/Link.vue.d.ts +51 -51
  53. package/lib/components/messageprovider/Message.vue.d.ts +79 -73
  54. package/lib/components/messageprovider/MessageProvider.vue.d.ts +58 -52
  55. package/lib/components/messageprovider/style/Message.css.d.ts +12 -12
  56. package/lib/components/messageprovider/style/index.d.ts +1 -1
  57. package/lib/components/messageprovider/types.d.ts +29 -29
  58. package/lib/components/messageprovider/useMessage.d.ts +2 -2
  59. package/lib/components/modal/Modal.vue.d.ts +52 -52
  60. package/lib/components/modal/style/Modal.css.d.ts +21 -21
  61. package/lib/components/modal/style/index.d.ts +1 -1
  62. package/lib/components/pagination/Pagination.vue.d.ts +84 -84
  63. package/lib/components/pagination/style/Pagination.css.d.ts +10 -10
  64. package/lib/components/pagination/style/index.d.ts +1 -1
  65. package/lib/components/radio/Radio.vue.d.ts +85 -85
  66. package/lib/components/radio/style/Checkbox.css.d.ts +16 -16
  67. package/lib/components/radio/style/index.d.ts +1 -1
  68. package/lib/components/radiobutton/RadioButton.vue.d.ts +98 -98
  69. package/lib/components/radiobutton/style/RadioButton.css.d.ts +14 -14
  70. package/lib/components/radiobutton/style/index.d.ts +1 -1
  71. package/lib/components/radiobuttongroup/RadioButtonGroup.vue.d.ts +48 -48
  72. package/lib/components/radiobuttongroup/style/RadioButtonGroup.css.d.ts +3 -3
  73. package/lib/components/radiobuttongroup/style/index.d.ts +1 -1
  74. package/lib/components/radiobuttongroup/symbol.d.ts +9 -9
  75. package/lib/components/select/Select.vue.d.ts +194 -194
  76. package/lib/components/select/style/Select.css.d.ts +31 -31
  77. package/lib/components/select/style/index.d.ts +1 -1
  78. package/lib/components/skeleton/Skeleton.vue.d.ts +33 -33
  79. package/lib/components/skeleton/style/Skeleton.css.d.ts +10 -8
  80. package/lib/components/skeleton/style/index.d.ts +2 -2
  81. package/lib/components/slider/Slider.vue.d.ts +32 -32
  82. package/lib/components/slider/style/Slider.css.d.ts +4 -4
  83. package/lib/components/slider/style/index.d.ts +1 -1
  84. package/lib/components/{toggle/Toggle.vue.d.ts → switch/Switch.vue.d.ts} +85 -85
  85. package/lib/components/{toggle/style/Toggle.css.d.ts → switch/style/Switch.css.d.ts} +7 -7
  86. package/lib/components/switch/style/index.d.ts +1 -0
  87. package/lib/components/tab/Tab.vue.d.ts +41 -41
  88. package/lib/components/tab/TabGroup.vue.d.ts +43 -43
  89. package/lib/components/table/Table.vue.d.ts +62 -62
  90. package/lib/components/table/TableBody.vue.d.ts +2 -2
  91. package/lib/components/table/TableCell.vue.d.ts +2 -2
  92. package/lib/components/table/TableHead.vue.d.ts +30 -30
  93. package/lib/components/table/TableHeadRow.vue.d.ts +2 -2
  94. package/lib/components/table/TableRow.vue.d.ts +2 -2
  95. package/lib/components/table/style/Table.css.d.ts +4 -4
  96. package/lib/components/table/style/index.d.ts +1 -1
  97. package/lib/components/table/types/index.d.ts +6 -6
  98. package/lib/components/tag/Tag.vue.d.ts +44 -44
  99. package/lib/components/tag/style/Tag.css.d.ts +11 -11
  100. package/lib/components/tag/style/index.d.ts +1 -1
  101. package/lib/components/textarea/{TextArea.vue.d.ts → Textarea.vue.d.ts} +137 -137
  102. package/lib/components/textarea/style/{TextArea.css.d.ts → Textarea.css.d.ts} +19 -19
  103. package/lib/components/textarea/style/index.d.ts +1 -1
  104. package/lib/components/tooltip/Tooltip.vue.d.ts +87 -71
  105. package/lib/components/tooltip/style/Tooltip.css.d.ts +10 -10
  106. package/lib/components/tooltip/style/index.d.ts +1 -1
  107. package/lib/components/transfer/Transfer.vue.d.ts +67 -67
  108. package/lib/components/transfer/style/Transfer.css.d.ts +7 -7
  109. package/lib/components/transfer/style/index.d.ts +1 -1
  110. package/lib/components/virtualscroll/VirtualScroll.vue.d.ts +73 -73
  111. package/lib/components/virtualscroll/style/VirtualScroll.css.d.ts +1 -1
  112. package/lib/components/virtualscroll/style/index.d.ts +1 -1
  113. package/lib/composables/element.d.ts +2 -2
  114. package/lib/composables/index.d.ts +3 -3
  115. package/lib/composables/useCachedUid.d.ts +13 -13
  116. package/lib/composables/useEventListener.d.ts +1 -1
  117. package/lib/composables/useInput.d.ts +36 -36
  118. package/lib/composables/useInteractive.d.ts +15 -15
  119. package/lib/composables/useIsServer.d.ts +1 -1
  120. package/lib/composables/useMount.d.ts +13 -13
  121. package/lib/composables/usePopper.d.ts +31 -31
  122. package/lib/composables/useZIndex.d.ts +8 -8
  123. package/lib/create.d.ts +9 -9
  124. package/lib/index.cjs.js +4 -4
  125. package/lib/index.d.ts +5 -5
  126. package/lib/index.es.js +4475 -4417
  127. package/lib/install.d.ts +4 -4
  128. package/lib/nuxt.js +33 -33
  129. package/lib/nuxt.plugin.js +8 -8
  130. package/lib/style.css +1 -1
  131. package/lib/styles/theme.css.d.ts +168 -167
  132. package/lib/styles/transitions.css.d.ts +12 -0
  133. package/lib/styles/typography.css.d.ts +22 -22
  134. package/lib/types/props.d.ts +3 -3
  135. package/package.json +3 -2
  136. package/src/__storybook__/argTypes.ts +61 -61
  137. package/src/__storybook__/createStory.ts +15 -15
  138. package/src/__storybook__/index.ts +2 -2
  139. package/src/components/avatar/Avatar.vue +110 -109
  140. package/src/components/avatar/examples/basic.vue +6 -6
  141. package/src/components/avatar/examples/custom-size.vue +7 -7
  142. package/src/components/avatar/examples/index.stories.ts +28 -28
  143. package/src/components/avatar/examples/index.ts +5 -5
  144. package/src/components/avatar/examples/sizes.vue +33 -33
  145. package/src/components/avatar/examples/slots.vue +8 -7
  146. package/src/components/avatar/examples/variants.vue +18 -18
  147. package/src/components/avatar/style/Avatar.css.ts +92 -92
  148. package/src/components/avatar/style/index.ts +1 -1
  149. package/src/components/avatargroup/AvatarGroup.vue +72 -71
  150. package/src/components/avatargroup/examples/basic.vue +37 -37
  151. package/src/components/avatargroup/examples/index.stories.ts +24 -24
  152. package/src/components/avatargroup/examples/index.ts +1 -1
  153. package/src/components/avatargroup/style/AvatarGroup.css.ts +21 -21
  154. package/src/components/avatargroup/style/index.ts +1 -1
  155. package/src/components/avatargroup/symbol.ts +16 -16
  156. package/src/components/badge/Badge.vue +43 -43
  157. package/src/components/badge/examples/basic.vue +10 -10
  158. package/src/components/badge/examples/index.stories.ts +21 -21
  159. package/src/components/badge/examples/index.ts +1 -1
  160. package/src/components/badge/style/Badge.css.ts +135 -135
  161. package/src/components/badge/style/index.ts +1 -1
  162. package/src/components/breadcrumb/Breadcrumb.vue +58 -58
  163. package/src/components/breadcrumb/BreadcrumbItem.vue +72 -72
  164. package/src/components/breadcrumb/examples/basic.vue +7 -7
  165. package/src/components/breadcrumb/examples/index.stories.ts +20 -20
  166. package/src/components/breadcrumb/examples/index.ts +1 -1
  167. package/src/components/breadcrumb/style/Breadcrumb.css.ts +39 -39
  168. package/src/components/breadcrumb/symbol.ts +16 -16
  169. package/src/components/button/Button.vue +203 -203
  170. package/src/components/button/examples/basic.vue +3 -3
  171. package/src/components/button/examples/disabled.vue +3 -3
  172. package/src/components/button/examples/icon-left.vue +12 -12
  173. package/src/components/button/examples/icon.vue +9 -9
  174. package/src/components/button/examples/index.stories.ts +35 -35
  175. package/src/components/button/examples/index.ts +8 -8
  176. package/src/components/button/examples/rounded.vue +7 -7
  177. package/src/components/button/examples/size.vue +7 -7
  178. package/src/components/button/examples/variants-secondary.vue +10 -10
  179. package/src/components/button/examples/variants.vue +10 -10
  180. package/src/components/button/style/Button.css.ts +677 -677
  181. package/src/components/button/style/index.ts +1 -1
  182. package/src/components/buttongroup/ButtonGroup.vue +36 -36
  183. package/src/components/buttongroup/examples/basic.vue +9 -9
  184. package/src/components/buttongroup/examples/icon-group.vue +21 -21
  185. package/src/components/buttongroup/examples/index.stories.ts +22 -22
  186. package/src/components/buttongroup/examples/index.ts +2 -2
  187. package/src/components/buttongroup/style/ButtonGroup.css.ts +39 -39
  188. package/src/components/buttongroup/style/index.ts +1 -1
  189. package/src/components/buttongroup/symbol.ts +7 -7
  190. package/src/components/checkbox/Checkbox.vue +156 -156
  191. package/src/components/checkbox/examples/basic.vue +9 -9
  192. package/src/components/checkbox/examples/index.stories.ts +21 -21
  193. package/src/components/checkbox/examples/index.ts +3 -3
  194. package/src/components/checkbox/examples/slot.vue +11 -11
  195. package/src/components/checkbox/style/Checkbox.css.ts +140 -140
  196. package/src/components/checkbox/style/index.ts +1 -1
  197. package/src/components/colorpicker/ColorPicker.vue +333 -324
  198. package/src/components/colorpicker/examples/basic.vue +2 -2
  199. package/src/components/colorpicker/examples/index.stories.ts +17 -17
  200. package/src/components/colorpicker/style/ColorPicker.css.ts +119 -117
  201. package/src/components/colorpicker/style/index.ts +1 -1
  202. package/src/components/colorpicker/utils.ts +187 -187
  203. package/src/components/dropdown/Dropdown.vue +270 -263
  204. package/src/components/dropdown/DropdownItem.vue +134 -134
  205. package/src/components/dropdown/DropdownList.vue +20 -20
  206. package/src/components/dropdown/DropdownSeperator.vue +22 -22
  207. package/src/components/dropdown/DropdownWrapper.vue +18 -18
  208. package/src/components/dropdown/examples/basic.vue +73 -73
  209. package/src/components/dropdown/examples/context.vue +71 -71
  210. package/src/components/dropdown/examples/index.stories.ts +28 -28
  211. package/src/components/dropdown/examples/index.ts +3 -3
  212. package/src/components/dropdown/hooks.ts +30 -30
  213. package/src/components/dropdown/style/Dropdown.css.ts +54 -54
  214. package/src/components/dropdown/style/index.ts +1 -1
  215. package/src/components/dropdown/symbol.ts +7 -7
  216. package/src/components/form/Form.vue +153 -153
  217. package/src/components/form/examples/basic.vue +75 -75
  218. package/src/components/form/examples/index.stories.ts +25 -25
  219. package/src/components/form/examples/index.ts +1 -1
  220. package/src/components/form/style/Form.css.ts +22 -22
  221. package/src/components/form/style/index.ts +1 -1
  222. package/src/components/form/symbol.ts +10 -10
  223. package/src/components/image/Image.vue +71 -71
  224. package/src/components/image/examples/basic.vue +5 -5
  225. package/src/components/image/examples/index.stories.ts +12 -12
  226. package/src/components/image/examples/index.ts +1 -1
  227. package/src/components/index.ts +41 -41
  228. package/src/components/input/Input.vue +218 -218
  229. package/src/components/input/examples/basic.vue +17 -8
  230. package/src/components/input/examples/index.stories.ts +24 -24
  231. package/src/components/input/examples/index.ts +4 -4
  232. package/src/components/input/examples/prefix.vue +9 -9
  233. package/src/components/input/examples/sizes.vue +9 -9
  234. package/src/components/input/examples/suffix.vue +9 -9
  235. package/src/components/input/style/Input.css.ts +221 -221
  236. package/src/components/input/style/index.ts +1 -1
  237. package/src/components/link/Link.vue +53 -53
  238. package/src/components/link/examples/basic.vue +3 -3
  239. package/src/components/link/examples/index.stories.ts +20 -20
  240. package/src/components/link/examples/index.ts +1 -1
  241. package/src/components/messageprovider/Message.vue +135 -123
  242. package/src/components/messageprovider/MessageProvider.vue +153 -144
  243. package/src/components/messageprovider/examples/basic.vue +70 -70
  244. package/src/components/messageprovider/examples/index.stories.ts +29 -29
  245. package/src/components/messageprovider/examples/index.ts +2 -2
  246. package/src/components/messageprovider/examples/update.vue +34 -34
  247. package/src/components/messageprovider/examples/wrapper.vue +9 -9
  248. package/src/components/messageprovider/style/Message.css.ts +110 -109
  249. package/src/components/messageprovider/style/index.ts +1 -1
  250. package/src/components/messageprovider/types.ts +47 -47
  251. package/src/components/messageprovider/useMessage.ts +12 -12
  252. package/src/components/modal/Modal.vue +121 -126
  253. package/src/components/modal/examples/basic.vue +40 -40
  254. package/src/components/modal/examples/index.stories.ts +20 -20
  255. package/src/components/modal/examples/index.ts +2 -2
  256. package/src/components/modal/examples/modal-form.vue +99 -99
  257. package/src/components/modal/style/Modal.css.ts +258 -258
  258. package/src/components/modal/style/index.ts +1 -1
  259. package/src/components/pagination/Pagination.vue +237 -237
  260. package/src/components/pagination/examples/basic.vue +17 -17
  261. package/src/components/pagination/examples/index.stories.ts +14 -14
  262. package/src/components/pagination/style/Pagination.css.ts +87 -87
  263. package/src/components/pagination/style/index.ts +1 -1
  264. package/src/components/radio/Radio.vue +137 -137
  265. package/src/components/radio/examples/basic.vue +9 -9
  266. package/src/components/radio/examples/index.stories.ts +19 -19
  267. package/src/components/radio/examples/index.ts +2 -2
  268. package/src/components/radio/style/Checkbox.css.ts +131 -131
  269. package/src/components/radio/style/index.ts +1 -1
  270. package/src/components/radiobutton/RadioButton.vue +131 -131
  271. package/src/components/radiobutton/style/RadioButton.css.ts +183 -183
  272. package/src/components/radiobutton/style/index.ts +1 -1
  273. package/src/components/radiobuttongroup/RadioButtonGroup.vue +74 -74
  274. package/src/components/radiobuttongroup/examples/basic.vue +16 -16
  275. package/src/components/radiobuttongroup/examples/index.stories.ts +22 -22
  276. package/src/components/radiobuttongroup/examples/index.ts +2 -2
  277. package/src/components/radiobuttongroup/style/RadioButtonGroup.css.ts +36 -36
  278. package/src/components/radiobuttongroup/symbol.ts +10 -10
  279. package/src/components/select/Select.vue +570 -569
  280. package/src/components/select/examples/basic.vue +20 -20
  281. package/src/components/select/examples/index.stories.ts +22 -22
  282. package/src/components/select/examples/index.ts +3 -3
  283. package/src/components/select/examples/multiple.vue +21 -21
  284. package/src/components/select/examples/searchable.vue +20 -20
  285. package/src/components/select/style/Select.css.ts +261 -261
  286. package/src/components/select/style/index.ts +1 -1
  287. package/src/components/skeleton/Skeleton.vue +55 -55
  288. package/src/components/skeleton/examples/basic.vue +3 -3
  289. package/src/components/skeleton/examples/index.stories.ts +17 -17
  290. package/src/components/skeleton/examples/index.ts +2 -2
  291. package/src/components/skeleton/examples/post.vue +8 -8
  292. package/src/components/skeleton/style/Skeleton.css.ts +72 -57
  293. package/src/components/skeleton/style/index.ts +1 -1
  294. package/src/components/slider/Slider.vue +76 -76
  295. package/src/components/slider/style/Slider.css.ts +42 -42
  296. package/src/components/slider/style/index.ts +1 -1
  297. package/src/components/{toggle/Toggle.vue → switch/Switch.vue} +132 -132
  298. package/src/components/{toggle → switch}/examples/basic.vue +9 -9
  299. package/src/components/switch/examples/index.stories.ts +20 -0
  300. package/src/components/switch/examples/index.ts +3 -0
  301. package/src/components/{toggle → switch}/examples/slot.vue +11 -11
  302. package/src/components/switch/style/Switch.css.ts +136 -0
  303. package/src/components/switch/style/index.ts +1 -0
  304. package/src/components/tab/Tab.css +113 -113
  305. package/src/components/tab/Tab.vue +98 -98
  306. package/src/components/tab/TabGroup.vue +90 -90
  307. package/src/components/tab/examples/basic.vue +19 -19
  308. package/src/components/tab/examples/index.stories.ts +25 -25
  309. package/src/components/tab/examples/index.ts +2 -2
  310. package/src/components/tab/examples/vertical.vue +19 -19
  311. package/src/components/table/Table.vue +119 -119
  312. package/src/components/table/TableBody.vue +13 -13
  313. package/src/components/table/TableCell.vue +13 -13
  314. package/src/components/table/TableHead.vue +46 -46
  315. package/src/components/table/TableHeadRow.vue +15 -15
  316. package/src/components/table/TableRow.vue +13 -13
  317. package/src/components/table/examples/basic.vue +55 -55
  318. package/src/components/table/examples/empty.vue +44 -44
  319. package/src/components/table/examples/index.stories.ts +20 -20
  320. package/src/components/table/examples/index.ts +2 -2
  321. package/src/components/table/style/Table.css.ts +57 -81
  322. package/src/components/table/types/index.ts +6 -6
  323. package/src/components/tag/Tag.vue +66 -66
  324. package/src/components/tag/examples/basic.vue +5 -5
  325. package/src/components/tag/examples/index.stories.ts +22 -22
  326. package/src/components/tag/examples/index.ts +1 -1
  327. package/src/components/tag/style/Tag.css.ts +79 -79
  328. package/src/components/tag/style/index.ts +1 -1
  329. package/src/components/textarea/{TextArea.vue → Textarea.vue} +181 -181
  330. package/src/components/textarea/examples/basic.vue +8 -8
  331. package/src/components/textarea/examples/index.stories.ts +18 -18
  332. package/src/components/textarea/examples/index.ts +1 -1
  333. package/src/components/textarea/style/{TextArea.css.ts → Textarea.css.ts} +191 -190
  334. package/src/components/textarea/style/index.ts +1 -1
  335. package/src/components/tooltip/Tooltip.vue +151 -118
  336. package/src/components/tooltip/examples/basic.vue +5 -5
  337. package/src/components/tooltip/examples/index.stories.ts +22 -22
  338. package/src/components/tooltip/examples/index.ts +2 -2
  339. package/src/components/tooltip/examples/placement.vue +9 -9
  340. package/src/components/tooltip/style/Tooltip.css.ts +91 -91
  341. package/src/components/tooltip/style/index.ts +1 -1
  342. package/src/components/transfer/Transfer.vue +143 -143
  343. package/src/components/transfer/examples/basic.vue +20 -20
  344. package/src/components/transfer/examples/index.stories.ts +15 -15
  345. package/src/components/transfer/examples/index.ts +1 -1
  346. package/src/components/transfer/style/Transfer.css.ts +67 -67
  347. package/src/components/transfer/style/index.ts +1 -1
  348. package/src/components/virtualscroll/VirtualScroll.css +13 -13
  349. package/src/components/virtualscroll/VirtualScroll.vue +166 -166
  350. package/src/components/virtualscroll/examples/basic.vue +31 -31
  351. package/src/components/virtualscroll/examples/index.stories.ts +15 -15
  352. package/src/components/virtualscroll/examples/index.ts +1 -1
  353. package/src/components/virtualscroll/style/VirtualScroll.css.ts +18 -18
  354. package/src/components/virtualscroll/style/index.ts +1 -1
  355. package/src/composables/element.ts +13 -13
  356. package/src/composables/index.ts +2 -2
  357. package/src/composables/useCachedUid.ts +48 -48
  358. package/src/composables/useEventListener.ts +14 -14
  359. package/src/composables/useInput.ts +129 -129
  360. package/src/composables/useInteractive.ts +19 -19
  361. package/src/composables/useIsServer.ts +7 -7
  362. package/src/composables/useMount.ts +43 -43
  363. package/src/composables/usePopper.ts +194 -194
  364. package/src/composables/useZIndex.ts +30 -30
  365. package/src/create.ts +34 -34
  366. package/src/css/components.css +16 -16
  367. package/src/css/index.css +4 -4
  368. package/src/css/transitions.css +40 -40
  369. package/src/css/variables.css +80 -80
  370. package/src/examples/cards/cards.stories.ts +9 -9
  371. package/src/examples/cards/sidebar.vue +262 -262
  372. package/src/exports/nuxt.js +33 -33
  373. package/src/exports/nuxt.plugin.js +8 -8
  374. package/src/index.ts +7 -7
  375. package/src/install.ts +8 -8
  376. package/src/shims-vue.d.ts +6 -6
  377. package/src/styles/theme.css.ts +171 -170
  378. package/src/styles/transitions.css.ts +62 -0
  379. package/src/styles/typography.css.ts +91 -91
  380. package/src/types/props.ts +5 -5
  381. package/volar.d.ts +16 -16
  382. package/lib/components/toggle/style/index.d.ts +0 -1
  383. package/src/components/avatargroup/AvatarGroup.css +0 -8
  384. package/src/components/badge/Badge.css +0 -128
  385. package/src/components/breadcrumb/Breadcrumb.css +0 -46
  386. package/src/components/button/Button-old.css +0 -378
  387. package/src/components/checkbox/Checkbox.css +0 -185
  388. package/src/components/input/Input.css +0 -173
  389. package/src/components/link/Link.css +0 -147
  390. package/src/components/messageprovider/MessageProvider.css +0 -23
  391. package/src/components/radio/Checkbox.css +0 -185
  392. package/src/components/select/Select.css +0 -0
  393. package/src/components/skeleton/Skeleton.css +0 -73
  394. package/src/components/tag/Tag.css +0 -0
  395. package/src/components/textarea/TextArea.css +0 -173
  396. package/src/components/toggle/examples/index.stories.ts +0 -20
  397. package/src/components/toggle/examples/index.ts +0 -3
  398. package/src/components/toggle/style/Toggle.css.ts +0 -137
  399. package/src/components/toggle/style/index.ts +0 -1
  400. package/src/components/tooltip/Tooltip.css +0 -43
@@ -1,569 +1,570 @@
1
- <template>
2
- <div ref="selectRef" tabindex="-1">
3
- <label v-if="label" :for="id" :class="style.label" :id="`${id}-label`">
4
- {{ label }}
5
- </label>
6
- <div v-if="description" :class="style.description">
7
- {{ description }}
8
- </div>
9
-
10
- <div :class="computedWrapperClasses" v-on="inputListeners" :id="id" ref="container"
11
- :aria-disabled="disabled ? 'true' : 'false'" :aria-labelledby="`${id}-label`" tabindex="0"
12
- @focusin="focusSelect">
13
-
14
- <div :class="selectComputedClasses">
15
- <template v-if="multiple && Array.isArray(selected) && selected.length > 0">
16
- <MTag
17
- v-for="value in selected"
18
- :key="value"
19
- :closeable="true"
20
- @close="removeSelected(value)"
21
- :size="size"
22
- >
23
- {{ getSelectedLabel(value) }}
24
- </MTag>
25
- </template>
26
- <template v-else-if="!multiple && selected">
27
- {{ getSelectedLabel(selected) }}
28
- </template>
29
- <template v-else>
30
- <div :class="style.placeholder">{{ placeholder }}</div>
31
- </template>
32
- </div>
33
-
34
- <Teleport :to="'body'">
35
- <Transition :name="transitionName">
36
- <div :class="style.menu" v-if="isOpen" ref="popper" :style="computedConsistentWidth"
37
- :aria-hidden="isOpen ? 'false' : 'true'">
38
- <div v-if="searchable" :class="style.search">
39
- <MInput v-model="search" placeholder="Search" size="sm" ref="searchRef"/>
40
- </div>
41
- <div :class="style.options">
42
- <div v-for="(option, index) in computedOptions" :key="index" ref="optionsRef"
43
- :class="{
44
- [style.option]: true,
45
- [style.optionSelected]: option.active,
46
- [style.optionFocused]: selectedIndex === index
47
- }"
48
- @click="option.onClick"
49
- @hover="selectedIndex = index">
50
- {{ option.label }}
51
- </div>
52
- </div>
53
- </div>
54
- </Transition>
55
- </Teleport>
56
- </div>
57
- <div v-if="inputError" :class="style.errorMessage">
58
- {{ inputError }}
59
- </div>
60
- </div>
61
- </template>
62
-
63
- <script lang="ts">
64
- import {useInput} from "../../composables/useInput";
65
- import {usePopper, type Placement} from "../../composables/usePopper";
66
- import type {Size} from "../../types/props";
67
- import {onClickOutside, useEventListener} from '@vueuse/core';
68
- import {
69
- computed,
70
- defineComponent,
71
- nextTick,
72
- ref,
73
- watch,
74
- watchEffect,
75
- defineExpose,
76
- type PropType
77
- } from "vue";
78
- import {MInput, MTag} from "..";
79
- import * as style from "./style";
80
- import {useInteractive} from "../../composables/useInteractive";
81
-
82
- export default defineComponent({
83
- name: 'MSelect',
84
- emits: useInput.emits(),
85
- props: {
86
- ...useInput.props(),
87
- ...useInteractive.props(),
88
- label: {
89
- type: String
90
- },
91
- placeholder: {
92
- type: String,
93
- default: 'Select an option'
94
- },
95
- options: {
96
- type: Array as PropType<Array<any>>,
97
- required: true
98
- },
99
- searchable: {
100
- type: Boolean,
101
- default: false
102
- },
103
- multiple: {
104
- type: Boolean,
105
- default: false
106
- },
107
- size: {
108
- type: String as PropType<Size>,
109
- default: 'md',
110
- },
111
- description: {
112
- type: String,
113
- default: ''
114
- },
115
- optionValue: {
116
- type: String,
117
- default: 'value'
118
- },
119
- optionLabel: {
120
- type: String,
121
- default: 'label'
122
- },
123
- transitionName: {
124
- type: String,
125
- default: 'fade'
126
- },
127
- consistentWidth: {
128
- type: Boolean,
129
- default: true
130
- },
131
- disabled: {
132
- type: Boolean,
133
- default: false
134
- },
135
- loading: {
136
- type: Boolean,
137
- default: false
138
- },
139
- error: {
140
- type: String,
141
- },
142
- },
143
- components: {
144
- MInput,
145
- MTag
146
- },
147
- setup(props, {emit}) {
148
- const container = ref<HTMLElement | null>(null);
149
- const wrapper = ref<HTMLElement>();
150
- const optionsRef = ref<HTMLElement[]>();
151
- const searchRef = ref<HTMLElement>();
152
- const selectRef = ref<HTMLElement>();
153
- const selectedIndex = ref<number | undefined>(0);
154
- const open = ref<boolean>(false);
155
- const focused = ref<boolean>(false);
156
- const search = ref<string>('');
157
- const placement = ref<Placement>("bottom-start");
158
- const transfer = ref(false);
159
- const width = ref<number>(0);
160
- const keyboardNavigation = ref<boolean>(false);
161
-
162
-
163
- const {focus, blur} = useInteractive(container);
164
- // TODO: Add debounce on keyboard movement (hover flicks it back up)
165
- const {
166
- id,
167
- insideForm,
168
- inputListeners,
169
- formError,
170
- formDisabled,
171
- formLoading
172
- } = useInput(props, {focus, emit, withListeners: false});
173
-
174
- const {popper} = usePopper({
175
- placement,
176
- transfer,
177
- reference: container,
178
- wrapper,
179
- offset: [0, 5]
180
- });
181
-
182
- const disabled = computed(() => formDisabled || props.disabled);
183
- const loading = computed(() => formLoading || props.loading);
184
-
185
- const selected = computed<any | any[]>({
186
- get() {
187
- if (props.multiple) {
188
- if (!props.modelValue) {
189
- return [];
190
- }
191
-
192
- if (Array.isArray(props.modelValue)) {
193
- return props.modelValue;
194
- }
195
-
196
- return [props.modelValue];
197
- }
198
-
199
- return props.modelValue || null;
200
- },
201
- set(value: string | number | []) {
202
- emit('update:modelValue', value);
203
- }
204
- });
205
-
206
- const computedConsistentWidth = computed(() => {
207
- if (props.consistentWidth) {
208
- return {
209
- width: width.value + 'px'
210
- }
211
- }
212
-
213
- return {};
214
- });
215
-
216
- const computedOptions = computed(() => {
217
- if (!props.options || props.options.length == 0) {
218
- return [];
219
- }
220
-
221
- // Filter options by search
222
- if (props.searchable && search.value) {
223
- return props.options.filter((option) => {
224
- return option[props.optionLabel].toLowerCase().includes(search.value.toLowerCase());
225
- }).map((option) => {
226
- if (option[props.optionValue] === undefined) {
227
- throw new Error('Option value is undefined');
228
- }
229
-
230
- if (option[props.optionLabel] === undefined) {
231
- throw new Error('Option label is undefined');
232
- }
233
-
234
- let value = option[props.optionValue];
235
- let active = false;
236
- if (props.multiple && Array.isArray(selected.value)) {
237
- active = selected.value.includes(value);
238
- } else {
239
- active = selected.value === value;
240
- }
241
-
242
- return {
243
- value: value,
244
- label: option[props.optionLabel],
245
- active: active,
246
- onClick: () => handleOptionClick(value)
247
- }
248
- }).filter((option) => {
249
- if (props.multiple && Array.isArray(selected.value)) {
250
- // Filter out selected options
251
- return !selected.value.includes(option.value);
252
- }
253
-
254
- return true;
255
- });
256
- }
257
-
258
- return props.options.map((option) => {
259
- if (option[props.optionValue] === undefined) {
260
- throw new Error('Option value is undefined');
261
- }
262
-
263
- if (option[props.optionLabel] === undefined) {
264
- throw new Error('Option label is undefined');
265
- }
266
-
267
- let value = option[props.optionValue];
268
- let active = false;
269
- if (props.multiple && Array.isArray(selected.value)) {
270
- active = selected.value.includes(value);
271
- } else {
272
- active = selected.value === value;
273
- }
274
-
275
- return {
276
- value: value,
277
- label: option[props.optionLabel],
278
- active: active,
279
- onClick: () => handleOptionClick(value)
280
- }
281
- }).filter((option) => {
282
- if (props.multiple && Array.isArray(selected.value)) {
283
- // Filter out selected options
284
- return !selected.value.includes(option.value);
285
- }
286
-
287
- return true;
288
- });
289
- });
290
-
291
- function openSelect() {
292
- if (disabled.value || loading.value) {
293
- return;
294
- }
295
-
296
- open.value = true;
297
- }
298
-
299
- function getSelectedIndex(start: number | undefined, direction = 'down') {
300
- if (typeof start === 'undefined') {
301
- start = direction === 'down' ? -1 : 1;
302
- }
303
-
304
- if (direction === 'down') {
305
- let next = start + 1;
306
-
307
- if (next > computedOptions.value.length - 1) {
308
- next = 0;
309
- }
310
-
311
- selectedIndex.value = next;
312
- } else {
313
- let next = start - 1;
314
-
315
- if (next < 0) {
316
- next = computedOptions.value.length - 1;
317
- }
318
-
319
- selectedIndex.value = next;
320
- }
321
- }
322
-
323
- function handleOptionClick(value: string | number) {
324
- const option = computedOptions.value.find((item) => item.value === value);
325
- if (!option) {
326
- return;
327
- }
328
-
329
- if (props.multiple) {
330
- if (Array.isArray(selected.value)) {
331
- const index = selected.value.indexOf(value);
332
-
333
- if (index !== -1) {
334
- selected.value.splice(index, 1);
335
- } else {
336
- selected.value.push(value);
337
- emit('update:modelValue', selected.value);
338
- }
339
- } else {
340
- selected.value = [value];
341
- }
342
- } else {
343
- selected.value = value;
344
- open.value = false;
345
- }
346
- }
347
-
348
- function removeSelected(value: string | number) {
349
- if (!props.multiple) {
350
- return;
351
- }
352
-
353
- if (Array.isArray(selected.value)) {
354
- const index = selected.value.indexOf(value);
355
-
356
- if (index !== -1) {
357
- selected.value.splice(index, 1);
358
- }
359
- }
360
- }
361
-
362
- function handleKeyDown(e: Event) {
363
- if (computedOptions.value.length === 0) {
364
- return;
365
- }
366
-
367
- if (props.disabled) {
368
- return;
369
- }
370
-
371
- keyboardNavigation.value = true;
372
-
373
- const event: KeyboardEvent = e as KeyboardEvent;
374
-
375
- switch (event.code) {
376
- case 'Tab':
377
- if (open.value) {
378
- open.value = false;
379
- }
380
- break;
381
- case 'ArrowDown':
382
- e.preventDefault();
383
- if (!open.value) {
384
- open.value = true;
385
- return;
386
- }
387
-
388
- getSelectedIndex(selectedIndex.value, 'down');
389
- break;
390
- case 'ArrowUp':
391
- e.preventDefault();
392
- if (!open.value) {
393
- return;
394
- }
395
-
396
- getSelectedIndex(selectedIndex.value, 'up');
397
- break;
398
- case 'Enter':
399
- e.preventDefault();
400
- e.stopPropagation();
401
-
402
- if (!open.value) {
403
- open.value = true;
404
- return;
405
- }
406
-
407
- if (typeof selectedIndex.value !== 'undefined') {
408
- handleOptionClick(computedOptions.value[selectedIndex.value].value);
409
- if (!props.multiple) {
410
- open.value = false;
411
- }
412
- }
413
- break;
414
- case 'Escape':
415
- e.preventDefault();
416
- e.stopPropagation();
417
-
418
- if (!open.value) {
419
- return;
420
- }
421
-
422
- open.value = false;
423
- break;
424
- }
425
- }
426
-
427
- function focusOut(e: Event) {
428
- console.log(e);
429
-
430
- }
431
-
432
- const transitionName = computed(() => {
433
- return `m-transition__${props.transitionName}`;
434
- });
435
-
436
- const containerComputedClasses = computed(() => {
437
- return [
438
- 'm-select__container',
439
- {
440
- 'm-form__input': insideForm
441
- }
442
- ]
443
- });
444
-
445
- const computedWrapperClasses = computed(() => {
446
- return [
447
- style.wrapper,
448
- {
449
- [style.focused]: focused.value,
450
- }
451
- ]
452
- });
453
-
454
- const selectComputedClasses = computed(() => {
455
- return [
456
- style.base,
457
- {
458
- [style.selectedTags]: props.multiple,
459
- [style.focused]: open.value,
460
- // [`m-select--${props.size}`]: props.size,
461
- 'm-select--disabled': disabled.value || loading.value,
462
- 'm-select--focused': open.value,
463
- 'm-select--multiple': props.multiple,
464
- 'm-select--error': formError.value
465
- }
466
- ]
467
- });
468
-
469
- function getSelectedLabel(value: string | number | []) {
470
- const option = props.options.find((i) => i[props.optionValue] === value)
471
- if (!option) {
472
- return null;
473
- }
474
-
475
- return option[props.optionLabel];
476
- }
477
-
478
- useEventListener(selectRef, 'keydown', handleKeyDown)
479
- useEventListener(searchRef, 'keydown', handleKeyDown)
480
-
481
- onClickOutside(container, () => {
482
- open.value = false;
483
- }, {ignore: [searchRef, popper]});
484
-
485
- watchEffect(() => {
486
- if (container.value && open.value) {
487
- width.value = container.value.offsetWidth;
488
- }
489
- });
490
-
491
- watch(selectedIndex, (index: number | undefined) => {
492
- if (!keyboardNavigation.value) {
493
- return;
494
- }
495
- if (typeof index !== 'undefined' && optionsRef.value) {
496
- optionsRef.value[index].scrollIntoView({block: 'nearest', inline: 'nearest'});
497
- }
498
- })
499
-
500
- watch(open, (value: boolean) => {
501
- nextTick(() => {
502
- if (value && optionsRef.value) {
503
- const index = computedOptions.value.findIndex((i) => i.value === selected.value);
504
- if (index !== -1) {
505
- optionsRef.value[index].scrollIntoView({block: 'center', inline: 'nearest'});
506
- selectedIndex.value = index;
507
- }
508
- }
509
-
510
- keyboardNavigation.value = false;
511
- });
512
- });
513
-
514
- const inputError = computed(() => {
515
- return formError.value || props.error;
516
- });
517
-
518
- const isOpen = computed(() => {
519
- if (props.multiple && computedOptions.value.length == 0 && !search.value) {
520
- return false;
521
- }
522
- return open.value;
523
- });
524
-
525
- const focusSelect = () => {
526
- if (selectRef.value) {
527
- openSelect();
528
- }
529
- }
530
-
531
- defineExpose({
532
- focus,
533
- blur,
534
- })
535
-
536
- return {
537
- container,
538
- optionsRef,
539
- searchRef,
540
- selectRef,
541
- popper,
542
- focusSelect,
543
- focusOut,
544
-
545
- id,
546
- isOpen,
547
- open,
548
- selected,
549
- computedOptions,
550
- selectedIndex,
551
- search,
552
-
553
- containerComputedClasses,
554
- selectComputedClasses,
555
- computedWrapperClasses,
556
- computedConsistentWidth,
557
-
558
- getSelectedLabel,
559
- openSelect,
560
- removeSelected,
561
- inputError,
562
- transitionName,
563
- inputListeners,
564
- style,
565
- focused
566
- }
567
- }
568
- });
569
- </script>
1
+ <template>
2
+ <div ref="selectRef" tabindex="-1">
3
+ <label v-if="label" :for="id" :class="style.label" :id="`${id}-label`">
4
+ {{ label }}
5
+ </label>
6
+ <div v-if="description" :class="style.description">
7
+ {{ description }}
8
+ </div>
9
+
10
+ <div :class="computedWrapperClasses" v-on="inputListeners" :id="id" ref="container"
11
+ :aria-disabled="disabled ? 'true' : 'false'" :aria-labelledby="`${id}-label`" tabindex="0"
12
+ @focusin="focusSelect">
13
+
14
+ <div :class="selectComputedClasses">
15
+ <template v-if="multiple && Array.isArray(selected) && selected.length > 0">
16
+ <MTag
17
+ v-for="value in selected"
18
+ :key="value"
19
+ :closeable="true"
20
+ @close="removeSelected(value)"
21
+ :size="size"
22
+ >
23
+ {{ getSelectedLabel(value) }}
24
+ </MTag>
25
+ </template>
26
+ <template v-else-if="!multiple && selected">
27
+ {{ getSelectedLabel(selected) }}
28
+ </template>
29
+ <template v-else>
30
+ <div :class="style.placeholder">{{ placeholder }}</div>
31
+ </template>
32
+ </div>
33
+
34
+ <Teleport :to="'body'">
35
+ <Transition :name="transitionName">
36
+ <div :class="style.menu" v-if="isOpen" ref="popper" :style="computedConsistentWidth"
37
+ :aria-hidden="isOpen ? 'false' : 'true'">
38
+ <div v-if="searchable" :class="style.search">
39
+ <MInput v-model="search" placeholder="Search" size="sm" ref="searchRef"/>
40
+ </div>
41
+ <div :class="style.options">
42
+ <div v-for="(option, index) in computedOptions" :key="index" ref="optionsRef"
43
+ :class="{
44
+ [style.option]: true,
45
+ [style.optionSelected]: option.active,
46
+ [style.optionFocused]: selectedIndex === index
47
+ }"
48
+ @click="option.onClick"
49
+ @hover="selectedIndex = index">
50
+ {{ option.label }}
51
+ </div>
52
+ </div>
53
+ </div>
54
+ </Transition>
55
+ </Teleport>
56
+ </div>
57
+ <div v-if="inputError" :class="style.errorMessage">
58
+ {{ inputError }}
59
+ </div>
60
+ </div>
61
+ </template>
62
+
63
+ <script lang="ts">
64
+ import {useInput} from "../../composables/useInput";
65
+ import {usePopper, type Placement} from "../../composables/usePopper";
66
+ import type {Size} from "../../types/props";
67
+ import {onClickOutside, useEventListener} from '@vueuse/core';
68
+ import {
69
+ computed,
70
+ defineComponent,
71
+ nextTick,
72
+ ref,
73
+ watch,
74
+ watchEffect,
75
+ defineExpose,
76
+ type PropType
77
+ } from "vue";
78
+ import MInput from "../input/Input.vue";
79
+ import MTag from "../tag/Tag.vue";
80
+ import * as style from "./style";
81
+ import {useInteractive} from "../../composables/useInteractive";
82
+
83
+ export default defineComponent({
84
+ name: 'MSelect',
85
+ emits: useInput.emits(),
86
+ props: {
87
+ ...useInput.props(),
88
+ ...useInteractive.props(),
89
+ label: {
90
+ type: String
91
+ },
92
+ placeholder: {
93
+ type: String,
94
+ default: 'Select an option'
95
+ },
96
+ options: {
97
+ type: Array as PropType<Array<any>>,
98
+ required: true
99
+ },
100
+ searchable: {
101
+ type: Boolean,
102
+ default: false
103
+ },
104
+ multiple: {
105
+ type: Boolean,
106
+ default: false
107
+ },
108
+ size: {
109
+ type: String as PropType<Size>,
110
+ default: 'md',
111
+ },
112
+ description: {
113
+ type: String,
114
+ default: ''
115
+ },
116
+ optionValue: {
117
+ type: String,
118
+ default: 'value'
119
+ },
120
+ optionLabel: {
121
+ type: String,
122
+ default: 'label'
123
+ },
124
+ transitionName: {
125
+ type: String,
126
+ default: 'fade'
127
+ },
128
+ consistentWidth: {
129
+ type: Boolean,
130
+ default: true
131
+ },
132
+ disabled: {
133
+ type: Boolean,
134
+ default: false
135
+ },
136
+ loading: {
137
+ type: Boolean,
138
+ default: false
139
+ },
140
+ error: {
141
+ type: String,
142
+ },
143
+ },
144
+ components: {
145
+ MInput,
146
+ MTag
147
+ },
148
+ setup(props, {emit}) {
149
+ const container = ref<HTMLElement | null>(null);
150
+ const wrapper = ref<HTMLElement>();
151
+ const optionsRef = ref<HTMLElement[]>();
152
+ const searchRef = ref<HTMLElement>();
153
+ const selectRef = ref<HTMLElement>();
154
+ const selectedIndex = ref<number | undefined>(0);
155
+ const open = ref<boolean>(false);
156
+ const focused = ref<boolean>(false);
157
+ const search = ref<string>('');
158
+ const placement = ref<Placement>("bottom-start");
159
+ const transfer = ref(false);
160
+ const width = ref<number>(0);
161
+ const keyboardNavigation = ref<boolean>(false);
162
+
163
+
164
+ const {focus, blur} = useInteractive(container);
165
+ // TODO: Add debounce on keyboard movement (hover flicks it back up)
166
+ const {
167
+ id,
168
+ insideForm,
169
+ inputListeners,
170
+ formError,
171
+ formDisabled,
172
+ formLoading
173
+ } = useInput(props, {focus, emit, withListeners: false});
174
+
175
+ const {popper} = usePopper({
176
+ placement,
177
+ transfer,
178
+ reference: container,
179
+ wrapper,
180
+ offset: [0, 5]
181
+ });
182
+
183
+ const disabled = computed(() => formDisabled || props.disabled);
184
+ const loading = computed(() => formLoading || props.loading);
185
+
186
+ const selected = computed<any | any[]>({
187
+ get() {
188
+ if (props.multiple) {
189
+ if (!props.modelValue) {
190
+ return [];
191
+ }
192
+
193
+ if (Array.isArray(props.modelValue)) {
194
+ return props.modelValue;
195
+ }
196
+
197
+ return [props.modelValue];
198
+ }
199
+
200
+ return props.modelValue || null;
201
+ },
202
+ set(value: string | number | []) {
203
+ emit('update:modelValue', value);
204
+ }
205
+ });
206
+
207
+ const computedConsistentWidth = computed(() => {
208
+ if (props.consistentWidth) {
209
+ return {
210
+ width: width.value + 'px'
211
+ }
212
+ }
213
+
214
+ return {};
215
+ });
216
+
217
+ const computedOptions = computed(() => {
218
+ if (!props.options || props.options.length == 0) {
219
+ return [];
220
+ }
221
+
222
+ // Filter options by search
223
+ if (props.searchable && search.value) {
224
+ return props.options.filter((option) => {
225
+ return option[props.optionLabel].toLowerCase().includes(search.value.toLowerCase());
226
+ }).map((option) => {
227
+ if (option[props.optionValue] === undefined) {
228
+ throw new Error('Option value is undefined');
229
+ }
230
+
231
+ if (option[props.optionLabel] === undefined) {
232
+ throw new Error('Option label is undefined');
233
+ }
234
+
235
+ let value = option[props.optionValue];
236
+ let active = false;
237
+ if (props.multiple && Array.isArray(selected.value)) {
238
+ active = selected.value.includes(value);
239
+ } else {
240
+ active = selected.value === value;
241
+ }
242
+
243
+ return {
244
+ value: value,
245
+ label: option[props.optionLabel],
246
+ active: active,
247
+ onClick: () => handleOptionClick(value)
248
+ }
249
+ }).filter((option) => {
250
+ if (props.multiple && Array.isArray(selected.value)) {
251
+ // Filter out selected options
252
+ return !selected.value.includes(option.value);
253
+ }
254
+
255
+ return true;
256
+ });
257
+ }
258
+
259
+ return props.options.map((option) => {
260
+ if (option[props.optionValue] === undefined) {
261
+ throw new Error('Option value is undefined');
262
+ }
263
+
264
+ if (option[props.optionLabel] === undefined) {
265
+ throw new Error('Option label is undefined');
266
+ }
267
+
268
+ let value = option[props.optionValue];
269
+ let active = false;
270
+ if (props.multiple && Array.isArray(selected.value)) {
271
+ active = selected.value.includes(value);
272
+ } else {
273
+ active = selected.value === value;
274
+ }
275
+
276
+ return {
277
+ value: value,
278
+ label: option[props.optionLabel],
279
+ active: active,
280
+ onClick: () => handleOptionClick(value)
281
+ }
282
+ }).filter((option) => {
283
+ if (props.multiple && Array.isArray(selected.value)) {
284
+ // Filter out selected options
285
+ return !selected.value.includes(option.value);
286
+ }
287
+
288
+ return true;
289
+ });
290
+ });
291
+
292
+ function openSelect() {
293
+ if (disabled.value || loading.value) {
294
+ return;
295
+ }
296
+
297
+ open.value = true;
298
+ }
299
+
300
+ function getSelectedIndex(start: number | undefined, direction = 'down') {
301
+ if (typeof start === 'undefined') {
302
+ start = direction === 'down' ? -1 : 1;
303
+ }
304
+
305
+ if (direction === 'down') {
306
+ let next = start + 1;
307
+
308
+ if (next > computedOptions.value.length - 1) {
309
+ next = 0;
310
+ }
311
+
312
+ selectedIndex.value = next;
313
+ } else {
314
+ let next = start - 1;
315
+
316
+ if (next < 0) {
317
+ next = computedOptions.value.length - 1;
318
+ }
319
+
320
+ selectedIndex.value = next;
321
+ }
322
+ }
323
+
324
+ function handleOptionClick(value: string | number) {
325
+ const option = computedOptions.value.find((item) => item.value === value);
326
+ if (!option) {
327
+ return;
328
+ }
329
+
330
+ if (props.multiple) {
331
+ if (Array.isArray(selected.value)) {
332
+ const index = selected.value.indexOf(value);
333
+
334
+ if (index !== -1) {
335
+ selected.value.splice(index, 1);
336
+ } else {
337
+ selected.value.push(value);
338
+ emit('update:modelValue', selected.value);
339
+ }
340
+ } else {
341
+ selected.value = [value];
342
+ }
343
+ } else {
344
+ selected.value = value;
345
+ open.value = false;
346
+ }
347
+ }
348
+
349
+ function removeSelected(value: string | number) {
350
+ if (!props.multiple) {
351
+ return;
352
+ }
353
+
354
+ if (Array.isArray(selected.value)) {
355
+ const index = selected.value.indexOf(value);
356
+
357
+ if (index !== -1) {
358
+ selected.value.splice(index, 1);
359
+ }
360
+ }
361
+ }
362
+
363
+ function handleKeyDown(e: Event) {
364
+ if (computedOptions.value.length === 0) {
365
+ return;
366
+ }
367
+
368
+ if (props.disabled) {
369
+ return;
370
+ }
371
+
372
+ keyboardNavigation.value = true;
373
+
374
+ const event: KeyboardEvent = e as KeyboardEvent;
375
+
376
+ switch (event.code) {
377
+ case 'Tab':
378
+ if (open.value) {
379
+ open.value = false;
380
+ }
381
+ break;
382
+ case 'ArrowDown':
383
+ e.preventDefault();
384
+ if (!open.value) {
385
+ open.value = true;
386
+ return;
387
+ }
388
+
389
+ getSelectedIndex(selectedIndex.value, 'down');
390
+ break;
391
+ case 'ArrowUp':
392
+ e.preventDefault();
393
+ if (!open.value) {
394
+ return;
395
+ }
396
+
397
+ getSelectedIndex(selectedIndex.value, 'up');
398
+ break;
399
+ case 'Enter':
400
+ e.preventDefault();
401
+ e.stopPropagation();
402
+
403
+ if (!open.value) {
404
+ open.value = true;
405
+ return;
406
+ }
407
+
408
+ if (typeof selectedIndex.value !== 'undefined') {
409
+ handleOptionClick(computedOptions.value[selectedIndex.value].value);
410
+ if (!props.multiple) {
411
+ open.value = false;
412
+ }
413
+ }
414
+ break;
415
+ case 'Escape':
416
+ e.preventDefault();
417
+ e.stopPropagation();
418
+
419
+ if (!open.value) {
420
+ return;
421
+ }
422
+
423
+ open.value = false;
424
+ break;
425
+ }
426
+ }
427
+
428
+ function focusOut(e: Event) {
429
+ console.log(e);
430
+
431
+ }
432
+
433
+ const transitionName = computed(() => {
434
+ return `m-transition__${props.transitionName}`;
435
+ });
436
+
437
+ const containerComputedClasses = computed(() => {
438
+ return [
439
+ 'm-select__container',
440
+ {
441
+ 'm-form__input': insideForm
442
+ }
443
+ ]
444
+ });
445
+
446
+ const computedWrapperClasses = computed(() => {
447
+ return [
448
+ style.wrapper,
449
+ {
450
+ [style.focused]: focused.value,
451
+ }
452
+ ]
453
+ });
454
+
455
+ const selectComputedClasses = computed(() => {
456
+ return [
457
+ style.base,
458
+ {
459
+ [style.selectedTags]: props.multiple,
460
+ [style.focused]: open.value,
461
+ // [`m-select--${props.size}`]: props.size,
462
+ 'm-select--disabled': disabled.value || loading.value,
463
+ 'm-select--focused': open.value,
464
+ 'm-select--multiple': props.multiple,
465
+ 'm-select--error': formError.value
466
+ }
467
+ ]
468
+ });
469
+
470
+ function getSelectedLabel(value: string | number | []) {
471
+ const option = props.options.find((i) => i[props.optionValue] === value)
472
+ if (!option) {
473
+ return null;
474
+ }
475
+
476
+ return option[props.optionLabel];
477
+ }
478
+
479
+ useEventListener(selectRef, 'keydown', handleKeyDown)
480
+ useEventListener(searchRef, 'keydown', handleKeyDown)
481
+
482
+ onClickOutside(container, () => {
483
+ open.value = false;
484
+ }, {ignore: [searchRef, popper]});
485
+
486
+ watchEffect(() => {
487
+ if (container.value && open.value) {
488
+ width.value = container.value.offsetWidth;
489
+ }
490
+ });
491
+
492
+ watch(selectedIndex, (index: number | undefined) => {
493
+ if (!keyboardNavigation.value) {
494
+ return;
495
+ }
496
+ if (typeof index !== 'undefined' && optionsRef.value) {
497
+ optionsRef.value[index].scrollIntoView({block: 'nearest', inline: 'nearest'});
498
+ }
499
+ })
500
+
501
+ watch(open, (value: boolean) => {
502
+ nextTick(() => {
503
+ if (value && optionsRef.value) {
504
+ const index = computedOptions.value.findIndex((i) => i.value === selected.value);
505
+ if (index !== -1) {
506
+ optionsRef.value[index].scrollIntoView({block: 'center', inline: 'nearest'});
507
+ selectedIndex.value = index;
508
+ }
509
+ }
510
+
511
+ keyboardNavigation.value = false;
512
+ });
513
+ });
514
+
515
+ const inputError = computed(() => {
516
+ return formError.value || props.error;
517
+ });
518
+
519
+ const isOpen = computed(() => {
520
+ if (props.multiple && computedOptions.value.length == 0 && !search.value) {
521
+ return false;
522
+ }
523
+ return open.value;
524
+ });
525
+
526
+ const focusSelect = () => {
527
+ if (selectRef.value) {
528
+ openSelect();
529
+ }
530
+ }
531
+
532
+ defineExpose({
533
+ focus,
534
+ blur,
535
+ })
536
+
537
+ return {
538
+ container,
539
+ optionsRef,
540
+ searchRef,
541
+ selectRef,
542
+ popper,
543
+ focusSelect,
544
+ focusOut,
545
+
546
+ id,
547
+ isOpen,
548
+ open,
549
+ selected,
550
+ computedOptions,
551
+ selectedIndex,
552
+ search,
553
+
554
+ containerComputedClasses,
555
+ selectComputedClasses,
556
+ computedWrapperClasses,
557
+ computedConsistentWidth,
558
+
559
+ getSelectedLabel,
560
+ openSelect,
561
+ removeSelected,
562
+ inputError,
563
+ transitionName,
564
+ inputListeners,
565
+ style,
566
+ focused
567
+ }
568
+ }
569
+ });
570
+ </script>