@teammodlr/ui-kit 2.0.25 → 2.0.27

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 (390) 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 +77 -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 +122 -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 -40
  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 +73 -73
  54. package/lib/components/messageprovider/MessageProvider.vue.d.ts +52 -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 +8 -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/tab/Tab.vue.d.ts +41 -41
  85. package/lib/components/tab/TabGroup.vue.d.ts +43 -43
  86. package/lib/components/table/Table.vue.d.ts +62 -62
  87. package/lib/components/table/TableBody.vue.d.ts +2 -2
  88. package/lib/components/table/TableCell.vue.d.ts +2 -2
  89. package/lib/components/table/TableHead.vue.d.ts +30 -30
  90. package/lib/components/table/TableHeadRow.vue.d.ts +2 -2
  91. package/lib/components/table/TableRow.vue.d.ts +2 -2
  92. package/lib/components/table/style/Table.css.d.ts +4 -4
  93. package/lib/components/table/style/index.d.ts +1 -1
  94. package/lib/components/table/types/index.d.ts +6 -6
  95. package/lib/components/tag/Tag.vue.d.ts +44 -44
  96. package/lib/components/tag/style/Tag.css.d.ts +11 -11
  97. package/lib/components/tag/style/index.d.ts +1 -1
  98. package/lib/components/textarea/TextArea.vue.d.ts +137 -137
  99. package/lib/components/textarea/style/TextArea.css.d.ts +19 -19
  100. package/lib/components/textarea/style/index.d.ts +1 -1
  101. package/lib/components/toggle/Toggle.vue.d.ts +85 -0
  102. package/lib/components/toggle/style/Toggle.css.d.ts +7 -0
  103. package/lib/components/toggle/style/index.d.ts +1 -0
  104. package/lib/components/tooltip/Tooltip.vue.d.ts +71 -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 +1896 -1778
  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 +167 -167
  132. package/lib/styles/typography.css.d.ts +22 -22
  133. package/lib/types/props.d.ts +3 -3
  134. package/package.json +2 -2
  135. package/src/__storybook__/argTypes.ts +61 -61
  136. package/src/__storybook__/createStory.ts +15 -15
  137. package/src/__storybook__/index.ts +2 -2
  138. package/src/components/avatar/Avatar.vue +109 -109
  139. package/src/components/avatar/examples/basic.vue +6 -6
  140. package/src/components/avatar/examples/custom-size.vue +7 -7
  141. package/src/components/avatar/examples/index.stories.ts +28 -28
  142. package/src/components/avatar/examples/index.ts +5 -5
  143. package/src/components/avatar/examples/sizes.vue +33 -33
  144. package/src/components/avatar/examples/slots.vue +7 -7
  145. package/src/components/avatar/examples/variants.vue +18 -18
  146. package/src/components/avatar/style/Avatar.css.ts +92 -92
  147. package/src/components/avatar/style/index.ts +1 -1
  148. package/src/components/avatargroup/AvatarGroup.css +8 -8
  149. package/src/components/avatargroup/AvatarGroup.vue +71 -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.css +128 -128
  157. package/src/components/badge/Badge.vue +43 -43
  158. package/src/components/badge/examples/basic.vue +10 -10
  159. package/src/components/badge/examples/index.stories.ts +21 -21
  160. package/src/components/badge/examples/index.ts +1 -1
  161. package/src/components/badge/style/Badge.css.ts +135 -135
  162. package/src/components/badge/style/index.ts +1 -1
  163. package/src/components/breadcrumb/Breadcrumb.css +46 -46
  164. package/src/components/breadcrumb/Breadcrumb.vue +58 -58
  165. package/src/components/breadcrumb/BreadcrumbItem.vue +72 -72
  166. package/src/components/breadcrumb/examples/basic.vue +7 -7
  167. package/src/components/breadcrumb/examples/index.stories.ts +20 -20
  168. package/src/components/breadcrumb/examples/index.ts +1 -1
  169. package/src/components/breadcrumb/style/Breadcrumb.css.ts +39 -39
  170. package/src/components/breadcrumb/symbol.ts +16 -16
  171. package/src/components/button/Button-old.css +378 -378
  172. package/src/components/button/Button.vue +203 -203
  173. package/src/components/button/examples/basic.vue +3 -3
  174. package/src/components/button/examples/disabled.vue +3 -3
  175. package/src/components/button/examples/icon-left.vue +12 -12
  176. package/src/components/button/examples/icon.vue +9 -9
  177. package/src/components/button/examples/index.stories.ts +35 -35
  178. package/src/components/button/examples/index.ts +8 -8
  179. package/src/components/button/examples/rounded.vue +7 -7
  180. package/src/components/button/examples/size.vue +7 -7
  181. package/src/components/button/examples/variants-secondary.vue +10 -10
  182. package/src/components/button/examples/variants.vue +10 -10
  183. package/src/components/button/style/Button.css.ts +677 -677
  184. package/src/components/button/style/index.ts +1 -1
  185. package/src/components/buttongroup/ButtonGroup.vue +36 -36
  186. package/src/components/buttongroup/examples/basic.vue +9 -9
  187. package/src/components/buttongroup/examples/icon-group.vue +21 -21
  188. package/src/components/buttongroup/examples/index.stories.ts +22 -22
  189. package/src/components/buttongroup/examples/index.ts +2 -2
  190. package/src/components/buttongroup/style/ButtonGroup.css.ts +39 -39
  191. package/src/components/buttongroup/style/index.ts +1 -1
  192. package/src/components/buttongroup/symbol.ts +7 -7
  193. package/src/components/checkbox/Checkbox.css +185 -185
  194. package/src/components/checkbox/Checkbox.vue +156 -156
  195. package/src/components/checkbox/examples/basic.vue +9 -9
  196. package/src/components/checkbox/examples/index.stories.ts +21 -21
  197. package/src/components/checkbox/examples/index.ts +3 -3
  198. package/src/components/checkbox/examples/slot.vue +11 -11
  199. package/src/components/checkbox/style/Checkbox.css.ts +140 -140
  200. package/src/components/checkbox/style/index.ts +1 -1
  201. package/src/components/colorpicker/ColorPicker.vue +324 -324
  202. package/src/components/colorpicker/examples/basic.vue +2 -2
  203. package/src/components/colorpicker/examples/index.stories.ts +17 -17
  204. package/src/components/colorpicker/style/ColorPicker.css.ts +116 -116
  205. package/src/components/colorpicker/style/index.ts +1 -1
  206. package/src/components/colorpicker/utils.ts +187 -187
  207. package/src/components/dropdown/Dropdown.vue +263 -263
  208. package/src/components/dropdown/DropdownItem.vue +134 -134
  209. package/src/components/dropdown/DropdownList.vue +20 -20
  210. package/src/components/dropdown/DropdownSeperator.vue +22 -22
  211. package/src/components/dropdown/DropdownWrapper.vue +18 -18
  212. package/src/components/dropdown/examples/basic.vue +73 -73
  213. package/src/components/dropdown/examples/context.vue +71 -71
  214. package/src/components/dropdown/examples/index.stories.ts +28 -28
  215. package/src/components/dropdown/examples/index.ts +3 -3
  216. package/src/components/dropdown/hooks.ts +30 -30
  217. package/src/components/dropdown/style/Dropdown.css.ts +54 -54
  218. package/src/components/dropdown/style/index.ts +1 -1
  219. package/src/components/dropdown/symbol.ts +7 -7
  220. package/src/components/form/Form.vue +153 -153
  221. package/src/components/form/examples/basic.vue +75 -75
  222. package/src/components/form/examples/index.stories.ts +25 -25
  223. package/src/components/form/examples/index.ts +1 -1
  224. package/src/components/form/style/Form.css.ts +22 -22
  225. package/src/components/form/style/index.ts +1 -1
  226. package/src/components/form/symbol.ts +10 -10
  227. package/src/components/image/Image.vue +71 -71
  228. package/src/components/image/examples/basic.vue +5 -5
  229. package/src/components/image/examples/index.stories.ts +12 -12
  230. package/src/components/image/examples/index.ts +1 -1
  231. package/src/components/index.ts +40 -39
  232. package/src/components/input/Input.css +173 -173
  233. package/src/components/input/Input.vue +218 -218
  234. package/src/components/input/examples/basic.vue +8 -8
  235. package/src/components/input/examples/index.stories.ts +24 -24
  236. package/src/components/input/examples/index.ts +4 -4
  237. package/src/components/input/examples/prefix.vue +9 -9
  238. package/src/components/input/examples/sizes.vue +9 -9
  239. package/src/components/input/examples/suffix.vue +9 -9
  240. package/src/components/input/style/Input.css.ts +221 -221
  241. package/src/components/input/style/index.ts +1 -1
  242. package/src/components/link/Link.css +147 -147
  243. package/src/components/link/Link.vue +53 -53
  244. package/src/components/link/examples/basic.vue +3 -3
  245. package/src/components/link/examples/index.stories.ts +20 -20
  246. package/src/components/link/examples/index.ts +1 -1
  247. package/src/components/messageprovider/Message.vue +123 -123
  248. package/src/components/messageprovider/MessageProvider.css +23 -23
  249. package/src/components/messageprovider/MessageProvider.vue +144 -144
  250. package/src/components/messageprovider/examples/basic.vue +70 -70
  251. package/src/components/messageprovider/examples/index.stories.ts +29 -29
  252. package/src/components/messageprovider/examples/index.ts +2 -2
  253. package/src/components/messageprovider/examples/update.vue +34 -34
  254. package/src/components/messageprovider/examples/wrapper.vue +9 -9
  255. package/src/components/messageprovider/style/Message.css.ts +109 -109
  256. package/src/components/messageprovider/style/index.ts +1 -1
  257. package/src/components/messageprovider/types.ts +47 -47
  258. package/src/components/messageprovider/useMessage.ts +12 -12
  259. package/src/components/modal/Modal.vue +125 -125
  260. package/src/components/modal/examples/basic.vue +40 -40
  261. package/src/components/modal/examples/index.stories.ts +20 -20
  262. package/src/components/modal/examples/index.ts +2 -2
  263. package/src/components/modal/examples/modal-form.vue +99 -99
  264. package/src/components/modal/style/Modal.css.ts +257 -257
  265. package/src/components/modal/style/index.ts +1 -1
  266. package/src/components/pagination/Pagination.vue +237 -237
  267. package/src/components/pagination/examples/basic.vue +17 -17
  268. package/src/components/pagination/examples/index.stories.ts +14 -14
  269. package/src/components/pagination/style/Pagination.css.ts +87 -87
  270. package/src/components/pagination/style/index.ts +1 -1
  271. package/src/components/radio/Checkbox.css +185 -185
  272. package/src/components/radio/Radio.vue +137 -137
  273. package/src/components/radio/examples/basic.vue +9 -9
  274. package/src/components/radio/examples/index.stories.ts +19 -19
  275. package/src/components/radio/examples/index.ts +2 -2
  276. package/src/components/radio/style/Checkbox.css.ts +131 -131
  277. package/src/components/radio/style/index.ts +1 -1
  278. package/src/components/radiobutton/RadioButton.vue +131 -131
  279. package/src/components/radiobutton/style/RadioButton.css.ts +183 -183
  280. package/src/components/radiobutton/style/index.ts +1 -1
  281. package/src/components/radiobuttongroup/RadioButtonGroup.vue +74 -74
  282. package/src/components/radiobuttongroup/examples/basic.vue +16 -16
  283. package/src/components/radiobuttongroup/examples/index.stories.ts +22 -22
  284. package/src/components/radiobuttongroup/examples/index.ts +2 -2
  285. package/src/components/radiobuttongroup/style/RadioButtonGroup.css.ts +36 -36
  286. package/src/components/radiobuttongroup/symbol.ts +10 -10
  287. package/src/components/select/Select.vue +569 -569
  288. package/src/components/select/examples/basic.vue +20 -20
  289. package/src/components/select/examples/index.stories.ts +22 -22
  290. package/src/components/select/examples/index.ts +3 -3
  291. package/src/components/select/examples/multiple.vue +21 -21
  292. package/src/components/select/examples/searchable.vue +20 -20
  293. package/src/components/select/style/Select.css.ts +261 -261
  294. package/src/components/select/style/index.ts +1 -1
  295. package/src/components/skeleton/Skeleton.css +73 -73
  296. package/src/components/skeleton/Skeleton.vue +55 -55
  297. package/src/components/skeleton/examples/basic.vue +3 -3
  298. package/src/components/skeleton/examples/index.stories.ts +17 -17
  299. package/src/components/skeleton/examples/index.ts +2 -2
  300. package/src/components/skeleton/examples/post.vue +8 -8
  301. package/src/components/skeleton/style/Skeleton.css.ts +56 -56
  302. package/src/components/skeleton/style/index.ts +1 -1
  303. package/src/components/slider/Slider.vue +76 -76
  304. package/src/components/slider/style/Slider.css.ts +42 -42
  305. package/src/components/slider/style/index.ts +1 -1
  306. package/src/components/tab/Tab.css +113 -113
  307. package/src/components/tab/Tab.vue +98 -98
  308. package/src/components/tab/TabGroup.vue +90 -90
  309. package/src/components/tab/examples/basic.vue +19 -19
  310. package/src/components/tab/examples/index.stories.ts +25 -25
  311. package/src/components/tab/examples/index.ts +2 -2
  312. package/src/components/tab/examples/vertical.vue +19 -19
  313. package/src/components/table/Table.vue +119 -119
  314. package/src/components/table/TableBody.vue +13 -13
  315. package/src/components/table/TableCell.vue +13 -13
  316. package/src/components/table/TableHead.vue +46 -46
  317. package/src/components/table/TableHeadRow.vue +15 -15
  318. package/src/components/table/TableRow.vue +13 -13
  319. package/src/components/table/examples/basic.vue +55 -55
  320. package/src/components/table/examples/empty.vue +44 -44
  321. package/src/components/table/examples/index.stories.ts +20 -20
  322. package/src/components/table/examples/index.ts +2 -2
  323. package/src/components/table/style/Table.css.ts +80 -80
  324. package/src/components/table/types/index.ts +6 -6
  325. package/src/components/tag/Tag.vue +66 -66
  326. package/src/components/tag/examples/basic.vue +5 -5
  327. package/src/components/tag/examples/index.stories.ts +22 -22
  328. package/src/components/tag/examples/index.ts +1 -1
  329. package/src/components/tag/style/Tag.css.ts +79 -79
  330. package/src/components/tag/style/index.ts +1 -1
  331. package/src/components/textarea/TextArea.css +173 -173
  332. package/src/components/textarea/TextArea.vue +181 -181
  333. package/src/components/textarea/examples/basic.vue +8 -8
  334. package/src/components/textarea/examples/index.stories.ts +18 -18
  335. package/src/components/textarea/style/TextArea.css.ts +189 -189
  336. package/src/components/textarea/style/index.ts +1 -1
  337. package/src/components/toggle/Toggle.vue +132 -0
  338. package/src/components/toggle/examples/basic.vue +9 -0
  339. package/src/components/toggle/examples/index.stories.ts +20 -0
  340. package/src/components/toggle/examples/index.ts +3 -0
  341. package/src/components/toggle/examples/slot.vue +11 -0
  342. package/src/components/toggle/style/Toggle.css.ts +135 -0
  343. package/src/components/toggle/style/index.ts +1 -0
  344. package/src/components/tooltip/Tooltip.css +43 -43
  345. package/src/components/tooltip/Tooltip.vue +118 -118
  346. package/src/components/tooltip/examples/basic.vue +5 -5
  347. package/src/components/tooltip/examples/index.stories.ts +22 -22
  348. package/src/components/tooltip/examples/index.ts +2 -2
  349. package/src/components/tooltip/examples/placement.vue +9 -9
  350. package/src/components/tooltip/style/Tooltip.css.ts +91 -91
  351. package/src/components/tooltip/style/index.ts +1 -1
  352. package/src/components/transfer/Transfer.vue +143 -143
  353. package/src/components/transfer/examples/basic.vue +20 -20
  354. package/src/components/transfer/examples/index.stories.ts +15 -15
  355. package/src/components/transfer/examples/index.ts +1 -1
  356. package/src/components/transfer/style/Transfer.css.ts +67 -67
  357. package/src/components/transfer/style/index.ts +1 -1
  358. package/src/components/virtualscroll/VirtualScroll.css +13 -13
  359. package/src/components/virtualscroll/VirtualScroll.vue +166 -166
  360. package/src/components/virtualscroll/examples/basic.vue +31 -31
  361. package/src/components/virtualscroll/examples/index.stories.ts +15 -15
  362. package/src/components/virtualscroll/examples/index.ts +1 -1
  363. package/src/components/virtualscroll/style/VirtualScroll.css.ts +18 -18
  364. package/src/components/virtualscroll/style/index.ts +1 -1
  365. package/src/composables/element.ts +13 -13
  366. package/src/composables/index.ts +2 -2
  367. package/src/composables/useCachedUid.ts +48 -48
  368. package/src/composables/useEventListener.ts +14 -14
  369. package/src/composables/useInput.ts +129 -129
  370. package/src/composables/useInteractive.ts +19 -19
  371. package/src/composables/useIsServer.ts +7 -7
  372. package/src/composables/useMount.ts +43 -43
  373. package/src/composables/usePopper.ts +194 -194
  374. package/src/composables/useZIndex.ts +30 -30
  375. package/src/create.ts +34 -34
  376. package/src/css/components.css +16 -15
  377. package/src/css/index.css +4 -4
  378. package/src/css/transitions.css +40 -40
  379. package/src/css/variables.css +80 -80
  380. package/src/examples/cards/cards.stories.ts +9 -9
  381. package/src/examples/cards/sidebar.vue +262 -262
  382. package/src/exports/nuxt.js +33 -33
  383. package/src/exports/nuxt.plugin.js +8 -8
  384. package/src/index.ts +7 -7
  385. package/src/install.ts +8 -8
  386. package/src/shims-vue.d.ts +6 -6
  387. package/src/styles/theme.css.ts +170 -170
  388. package/src/styles/typography.css.ts +91 -91
  389. package/src/types/props.ts +5 -5
  390. package/volar.d.ts +16 -16
@@ -1,569 +1,569 @@
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, 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>