vueless 0.0.4 → 0.0.5

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 (318) hide show
  1. package/package.json +1 -1
  2. package/src/library.web-types-gen/index.js +17 -0
  3. package/src/library.web-types-gen/lib/build.js +252 -0
  4. package/src/library.web-types-gen/lib/config.js +32 -0
  5. package/src/library.web-types-gen/package.json +3 -0
  6. package/src/plugin.vite/index.js +59 -0
  7. package/src/plugin.vite/services/iconResolver.service.js +291 -0
  8. package/src/plugin.vite/services/svgLoader.service.js +76 -0
  9. package/src/plugin.vite/services/tailwindSafelist.service.js +195 -0
  10. package/src/plugin.vite/services/unpluginComponentsResolver.js +172 -0
  11. package/src/service.storybook/index.js +91 -0
  12. package/src/ui.button/Docs.mdx +16 -0
  13. package/src/ui.button/composables/attrs.composable.js +41 -0
  14. package/src/ui.button/configs/default.config.js +165 -0
  15. package/src/ui.button/constants/index.js +5 -0
  16. package/src/ui.button/index.stories.js +166 -0
  17. package/src/ui.button/index.vue +152 -0
  18. package/src/ui.button-link/Docs.mdx +16 -0
  19. package/src/ui.button-link/composables/attrs.composable.js +99 -0
  20. package/src/ui.button-link/configs/default.config.js +80 -0
  21. package/src/ui.button-link/constants/index.js +5 -0
  22. package/src/ui.button-link/index.stories.js +158 -0
  23. package/src/ui.button-link/index.vue +226 -0
  24. package/src/ui.button-toggle/Docs.mdx +16 -0
  25. package/src/ui.button-toggle/composables/attrs.composable.js +16 -0
  26. package/src/ui.button-toggle/configs/default.config.js +12 -0
  27. package/src/ui.button-toggle/constants/index.js +7 -0
  28. package/src/ui.button-toggle/index.stories.js +155 -0
  29. package/src/ui.button-toggle/index.vue +128 -0
  30. package/src/ui.button-toggle-item/Docs.mdx +16 -0
  31. package/src/ui.button-toggle-item/composables/attrs.composable.js +53 -0
  32. package/src/ui.button-toggle-item/configs/default.config.js +58 -0
  33. package/src/ui.button-toggle-item/constants/index.js +5 -0
  34. package/src/ui.button-toggle-item/index.stories.js +77 -0
  35. package/src/ui.button-toggle-item/index.vue +147 -0
  36. package/src/ui.container-accordion/composables/attrs.composable.js +45 -0
  37. package/src/ui.container-accordion/configs/default.config.js +32 -0
  38. package/src/ui.container-accordion/constants/index.js +5 -0
  39. package/src/ui.container-accordion/index.stories.js +89 -0
  40. package/src/ui.container-accordion/index.vue +95 -0
  41. package/src/ui.container-card/Docs.mdx +16 -0
  42. package/src/ui.container-card/composable/attrs.composable.js +56 -0
  43. package/src/ui.container-card/configs/default.config.js +31 -0
  44. package/src/ui.container-card/constants/index.js +5 -0
  45. package/src/ui.container-card/index.stories.js +170 -0
  46. package/src/ui.container-card/index.vue +146 -0
  47. package/src/ui.container-divider/Docs.mdx +16 -0
  48. package/src/ui.container-divider/configs/default.config.js +79 -0
  49. package/src/ui.container-divider/index.stories.js +124 -0
  50. package/src/ui.container-group/Docs.mdx +16 -0
  51. package/src/ui.container-group/composables/attrs.composable.js +44 -0
  52. package/src/ui.container-group/configs/default.config.js +29 -0
  53. package/src/ui.container-group/constants/index.js +5 -0
  54. package/src/ui.container-group/index.stories.js +88 -0
  55. package/src/ui.container-group/index.vue +106 -0
  56. package/src/ui.container-groups/Docs.mdx +16 -0
  57. package/src/ui.container-groups/composables/attrs.composable.js +12 -0
  58. package/src/ui.container-groups/configs/default.config.js +3 -0
  59. package/src/ui.container-groups/index.stories.js +45 -0
  60. package/src/ui.container-groups/index.vue +33 -0
  61. package/src/ui.container-modal/Docs.mdx +16 -0
  62. package/src/ui.container-modal/composables/attrs.composable.js +90 -0
  63. package/src/ui.container-modal/configs/default.config.js +69 -0
  64. package/src/ui.container-modal/constants/index.js +5 -0
  65. package/src/ui.container-modal/index.stories.js +170 -0
  66. package/src/ui.container-modal/index.vue +335 -0
  67. package/src/ui.container-modal-confirm/Docs.mdx +16 -0
  68. package/src/ui.container-modal-confirm/composable/attrs.composable.js +20 -0
  69. package/src/ui.container-modal-confirm/configs/default.config.js +15 -0
  70. package/src/ui.container-modal-confirm/constants/index.js +5 -0
  71. package/src/ui.container-modal-confirm/index.stories.js +209 -0
  72. package/src/ui.container-modal-confirm/index.vue +182 -0
  73. package/src/ui.container-page/Docs.mdx +16 -0
  74. package/src/ui.container-page/composables/attrs.composable.js +96 -0
  75. package/src/ui.container-page/configs/default.config.js +71 -0
  76. package/src/ui.container-page/constants/index.js +5 -0
  77. package/src/ui.container-page/index.stories.js +147 -0
  78. package/src/ui.container-page/index.vue +271 -0
  79. package/src/ui.container-row/Docs.mdx +16 -0
  80. package/src/ui.container-row/composables/attrs.composable.js +23 -0
  81. package/src/ui.container-row/configs/default.config.js +14 -0
  82. package/src/ui.container-row/constants/index.js +5 -0
  83. package/src/ui.container-row/index.stories.js +81 -0
  84. package/src/ui.container-row/index.vue +45 -0
  85. package/src/ui.data-list/composables/attrs.composable.js +45 -0
  86. package/src/ui.data-list/configs/default.config.js +32 -0
  87. package/src/ui.data-list/constants/index.js +5 -0
  88. package/src/ui.data-list/index.stories.js +91 -0
  89. package/src/ui.data-list/index.vue +258 -0
  90. package/src/ui.data-table/Docs.mdx +16 -0
  91. package/src/ui.data-table-cell/configs/default.config.js +19 -0
  92. package/src/ui.dropdown-badge/Docs.mdx +16 -0
  93. package/src/ui.dropdown-badge/composables/attrs.composable.js +63 -0
  94. package/src/ui.dropdown-badge/configs/default.config.js +34 -0
  95. package/src/ui.dropdown-badge/constants/index.js +5 -0
  96. package/src/ui.dropdown-badge/index.stories.js +126 -0
  97. package/src/ui.dropdown-badge/index.vue +233 -0
  98. package/src/ui.dropdown-button/Docs.mdx +16 -0
  99. package/src/ui.dropdown-button/composables/attrs.composable.js +63 -0
  100. package/src/ui.dropdown-button/configs/default.config.js +37 -0
  101. package/src/ui.dropdown-button/constants/index.js +14 -0
  102. package/src/ui.dropdown-button/index.stories.js +158 -0
  103. package/src/ui.dropdown-button/index.vue +271 -0
  104. package/src/ui.dropdown-item/Docs.mdx +16 -0
  105. package/src/ui.dropdown-item/composables/attrs.composable.js +13 -0
  106. package/src/ui.dropdown-item/configs/default.config.js +16 -0
  107. package/src/ui.dropdown-item/index.stories.js +30 -0
  108. package/src/ui.dropdown-item/index.vue +53 -0
  109. package/src/ui.dropdown-link/Docs.mdx +16 -0
  110. package/src/ui.dropdown-link/composables/attrs.composable.js +65 -0
  111. package/src/ui.dropdown-link/configs/default.config.js +37 -0
  112. package/src/ui.dropdown-link/constants/index.js +5 -0
  113. package/src/ui.dropdown-link/index.stories.js +127 -0
  114. package/src/ui.dropdown-link/index.vue +260 -0
  115. package/src/ui.dropdown-list/Docs.mdx +16 -0
  116. package/src/ui.dropdown-list/composables/attrs.composable.js +93 -0
  117. package/src/ui.dropdown-list/composables/usePointer.js +77 -0
  118. package/src/ui.dropdown-list/configs/default.config.js +74 -0
  119. package/src/ui.dropdown-list/constants/index.js +5 -0
  120. package/src/ui.dropdown-list/index.stories.js +76 -0
  121. package/src/ui.dropdown-list/index.vue +282 -0
  122. package/src/ui.form-calendar/Docs.mdx +52 -0
  123. package/src/ui.form-calendar/components/DayView.vue +268 -0
  124. package/src/ui.form-calendar/components/MonthView.vue +114 -0
  125. package/src/ui.form-calendar/components/YearView.vue +118 -0
  126. package/src/ui.form-calendar/constants/index.js +71 -0
  127. package/src/ui.form-calendar/index.stories.js +59 -0
  128. package/src/ui.form-calendar/index.vue +738 -0
  129. package/src/ui.form-calendar/services/calendar.service.js +189 -0
  130. package/src/ui.form-calendar/services/formatting.service.js +180 -0
  131. package/src/ui.form-checkbox/Docs.mdx +16 -0
  132. package/src/ui.form-checkbox/configs/default.config.js +69 -0
  133. package/src/ui.form-checkbox/index.stories.js +147 -0
  134. package/src/ui.form-checkbox-group/Docs.mdx +16 -0
  135. package/src/ui.form-checkbox-group/composables/attrs.composable.js +17 -0
  136. package/src/ui.form-checkbox-group/configs/default.config.js +5 -0
  137. package/src/ui.form-checkbox-group/constants/index.js +5 -0
  138. package/src/ui.form-checkbox-group/index.stories.js +45 -0
  139. package/src/ui.form-checkbox-group/index.vue +143 -0
  140. package/src/ui.form-checkbox-multi-state/Docs.mdx +16 -0
  141. package/src/ui.form-checkbox-multi-state/composables/attrs.composable.js +24 -0
  142. package/src/ui.form-checkbox-multi-state/configs/default.config.js +9 -0
  143. package/src/ui.form-checkbox-multi-state/constants/index.js +5 -0
  144. package/src/ui.form-checkbox-multi-state/index.stories.js +59 -0
  145. package/src/ui.form-checkbox-multi-state/index.vue +133 -0
  146. package/src/ui.form-color-picker/composables/attrs.composable.js +44 -0
  147. package/src/ui.form-color-picker/configs/default.config.js +52 -0
  148. package/src/ui.form-color-picker/constants/index.js +5 -0
  149. package/src/ui.form-color-picker/index.stories.js +63 -0
  150. package/src/ui.form-color-picker/index.vue +168 -0
  151. package/src/ui.form-date-picker/Docs.mdx +52 -0
  152. package/src/ui.form-date-picker/composables/attrs.composable.js +22 -0
  153. package/src/ui.form-date-picker/configs/default.config.js +26 -0
  154. package/src/ui.form-date-picker/constants/index.js +5 -0
  155. package/src/ui.form-date-picker/index.stories.js +132 -0
  156. package/src/ui.form-date-picker/index.vue +253 -0
  157. package/src/ui.form-date-picker-range/constants/index.js +23 -0
  158. package/src/ui.form-date-picker-range/index.stories.js +135 -0
  159. package/src/ui.form-date-picker-range/index.vue +929 -0
  160. package/src/ui.form-date-picker-range/services/dateRange.service.js +116 -0
  161. package/src/ui.form-input/Docs.mdx +16 -0
  162. package/src/ui.form-input/assets/fonts/text-security-disc.woff +0 -0
  163. package/src/ui.form-input/composables/attrs.composable.js +66 -0
  164. package/src/ui.form-input/configs/default.config.js +72 -0
  165. package/src/ui.form-input/constants/index.js +5 -0
  166. package/src/ui.form-input/index.stories.js +166 -0
  167. package/src/ui.form-input/index.vue +385 -0
  168. package/src/ui.form-input-file/composables/attrs.composable.js +82 -0
  169. package/src/ui.form-input-file/configs/default.config.js +59 -0
  170. package/src/ui.form-input-file/constants/index.js +5 -0
  171. package/src/ui.form-input-file/index.stories.js +86 -0
  172. package/src/ui.form-input-file/index.vue +385 -0
  173. package/src/ui.form-input-money/Docs.mdx +16 -0
  174. package/src/ui.form-input-money/composables/attrs.composable.js +13 -0
  175. package/src/ui.form-input-money/composables/useFormatCurrency.js +82 -0
  176. package/src/ui.form-input-money/configs/default.config.js +16 -0
  177. package/src/ui.form-input-money/constants/index.js +5 -0
  178. package/src/ui.form-input-money/index.stories.js +126 -0
  179. package/src/ui.form-input-money/index.vue +264 -0
  180. package/src/ui.form-input-money/services/format.service.js +72 -0
  181. package/src/ui.form-input-number/Docs.mdx +16 -0
  182. package/src/ui.form-input-number/composables/attrs.composable.js +47 -0
  183. package/src/ui.form-input-number/configs/default.config.js +33 -0
  184. package/src/ui.form-input-number/constants/index.js +5 -0
  185. package/src/ui.form-input-number/index.stories.js +103 -0
  186. package/src/ui.form-input-number/index.vue +159 -0
  187. package/src/ui.form-input-rating/composables/attrs.composable.js +34 -0
  188. package/src/ui.form-input-rating/constants/index.js +5 -0
  189. package/src/ui.form-input-search/composables/attrs.composable.js +21 -0
  190. package/src/ui.form-input-search/configs/default.config.js +20 -0
  191. package/src/ui.form-input-search/constants/index.js +5 -0
  192. package/src/ui.form-input-search/index.stories.js +90 -0
  193. package/src/ui.form-input-search/index.vue +212 -0
  194. package/src/ui.form-label/Docs.mdx +16 -0
  195. package/src/ui.form-label/composables/attrs.composable.js +65 -0
  196. package/src/ui.form-label/configs/default.config.js +95 -0
  197. package/src/ui.form-label/constants/index.js +13 -0
  198. package/src/ui.form-label/index.stories.js +107 -0
  199. package/src/ui.form-label/index.vue +170 -0
  200. package/src/ui.form-radio/Docs.mdx +16 -0
  201. package/src/ui.form-radio/composables/attrs.composable.js +34 -0
  202. package/src/ui.form-radio/configs/default.config.js +47 -0
  203. package/src/ui.form-radio/constants/index.js +5 -0
  204. package/src/ui.form-radio/index.stories.js +71 -0
  205. package/src/ui.form-radio/index.vue +169 -0
  206. package/src/ui.form-radio-card/Docs.mdx +16 -0
  207. package/src/ui.form-radio-card/constants/index.js +5 -0
  208. package/src/ui.form-radio-card/index.stories.js +149 -0
  209. package/src/ui.form-radio-card/services/variant.service.js +15 -0
  210. package/src/ui.form-radio-group/Docs.mdx +16 -0
  211. package/src/ui.form-radio-group/composables/attrs.composable.js +27 -0
  212. package/src/ui.form-radio-group/configs/default.config.js +18 -0
  213. package/src/ui.form-radio-group/constants/index.js +5 -0
  214. package/src/ui.form-radio-group/index.stories.js +42 -0
  215. package/src/ui.form-radio-group/index.vue +127 -0
  216. package/src/ui.form-select/Docs.mdx +16 -0
  217. package/src/ui.form-select/composables/attrs.composable.js +172 -0
  218. package/src/ui.form-select/configs/default.config.js +138 -0
  219. package/src/ui.form-select/constants/index.js +19 -0
  220. package/src/ui.form-select/index.stories.js +339 -0
  221. package/src/ui.form-select/index.vue +719 -0
  222. package/src/ui.form-select/services/select.service.js +98 -0
  223. package/src/ui.form-switch/composables/attrs.composable.js +77 -0
  224. package/src/ui.form-switch/configs/default.config.js +76 -0
  225. package/src/ui.form-switch/constants/index.js +5 -0
  226. package/src/ui.form-switch/index.stories.js +93 -0
  227. package/src/ui.form-switch/index.vue +198 -0
  228. package/src/ui.form-switch/services/variant.service.js +31 -0
  229. package/src/ui.form-textarea/Docs.mdx +16 -0
  230. package/src/ui.form-textarea/composables/attrs.composable.js +52 -0
  231. package/src/ui.form-textarea/configs/default.config.js +68 -0
  232. package/src/ui.form-textarea/constants/index.js +5 -0
  233. package/src/ui.form-textarea/index.stories.js +151 -0
  234. package/src/ui.form-textarea/index.vue +284 -0
  235. package/src/ui.image-avatar/composables/attrs.composable.js +34 -0
  236. package/src/ui.image-avatar/configs/default.config.js +42 -0
  237. package/src/ui.image-avatar/constants/index.js +5 -0
  238. package/src/ui.image-avatar/default-avatar.png +0 -0
  239. package/src/ui.image-avatar/index.stories.js +107 -0
  240. package/src/ui.image-avatar/index.vue +121 -0
  241. package/src/ui.image-icon/Docs.mdx +16 -0
  242. package/src/ui.image-icon/index.stories.js +110 -0
  243. package/src/ui.image-logo/configs/default.config.js +38 -0
  244. package/src/ui.image-logo/index.stories.js +84 -0
  245. package/src/ui.loader-top/components/TopProgress.vue +277 -0
  246. package/src/ui.navigation-pagination/composables/attrs.composable.js +41 -0
  247. package/src/ui.navigation-pagination/configs/default.config.js +24 -0
  248. package/src/ui.navigation-pagination/constants/index.js +8 -0
  249. package/src/ui.navigation-pagination/index.stories.js +52 -0
  250. package/src/ui.navigation-pagination/index.vue +275 -0
  251. package/src/ui.navigation-stepper/composables/attrs.composable.js +25 -0
  252. package/src/ui.navigation-stepper/configs/default.config.js +13 -0
  253. package/src/ui.navigation-stepper/constants/index.js +5 -0
  254. package/src/ui.navigation-stepper/index.stories.js +30 -0
  255. package/src/ui.navigation-stepper/index.vue +128 -0
  256. package/src/ui.navigation-tab/composables/attrs.composable.js +30 -0
  257. package/src/ui.navigation-tab/configs/default.config.js +22 -0
  258. package/src/ui.navigation-tab/constants/index.js +5 -0
  259. package/src/ui.navigation-tab/index.stories.js +57 -0
  260. package/src/ui.navigation-tab/index.vue +85 -0
  261. package/src/ui.navigation-tabs/composables/attrs.composable.js +24 -0
  262. package/src/ui.navigation-tabs/configs/default.config.js +14 -0
  263. package/src/ui.navigation-tabs/constants/index.js +5 -0
  264. package/src/ui.navigation-tabs/index.stories.js +69 -0
  265. package/src/ui.navigation-tabs/index.vue +99 -0
  266. package/src/ui.notify/index.stories.js +102 -0
  267. package/src/ui.other-dot/composables/attrs.composable.js +32 -0
  268. package/src/ui.other-dot/configs/default.config.js +21 -0
  269. package/src/ui.other-dot/constants/index.js +5 -0
  270. package/src/ui.other-dot/index.stories.js +77 -0
  271. package/src/ui.other-dot/index.vue +52 -0
  272. package/src/ui.other-loader/composables/attrs.composable.js +51 -0
  273. package/src/ui.other-loader/configs/default.config.js +47 -0
  274. package/src/ui.other-loader/constants/index.js +5 -0
  275. package/src/ui.other-loader/index.stories.js +78 -0
  276. package/src/ui.other-loader/index.vue +136 -0
  277. package/src/ui.text-alert/composables/attrs.composable.js +48 -0
  278. package/src/ui.text-alert/configs/default.config.js +51 -0
  279. package/src/ui.text-alert/constatns/index.js +5 -0
  280. package/src/ui.text-alert/index.stories.js +157 -0
  281. package/src/ui.text-alert/index.vue +121 -0
  282. package/src/ui.text-badge/Docs.mdx +16 -0
  283. package/src/ui.text-badge/composables/attrs.composable.js +49 -0
  284. package/src/ui.text-badge/configs/default.config.js +51 -0
  285. package/src/ui.text-badge/constants/index.js +5 -0
  286. package/src/ui.text-badge/index.stories.js +190 -0
  287. package/src/ui.text-badge/index.vue +120 -0
  288. package/src/ui.text-block/composables/attrs.composable.js +31 -0
  289. package/src/ui.text-block/configs/default.config.js +35 -0
  290. package/src/ui.text-block/constatns/index.js +5 -0
  291. package/src/ui.text-block/index.stories.js +112 -0
  292. package/src/ui.text-block/index.vue +76 -0
  293. package/src/ui.text-empty/Docs.mdx +16 -0
  294. package/src/ui.text-empty/configs/default.config.js +30 -0
  295. package/src/ui.text-empty/index.stories.js +106 -0
  296. package/src/ui.text-file/composables/attrs.composable.js +37 -0
  297. package/src/ui.text-file/configs/default.config.js +15 -0
  298. package/src/ui.text-file/index.stories.js +29 -0
  299. package/src/ui.text-file/index.vue +93 -0
  300. package/src/ui.text-files/composables/attrs.composable.js +19 -0
  301. package/src/ui.text-files/configs/default.config.js +9 -0
  302. package/src/ui.text-files/constants/index.js +5 -0
  303. package/src/ui.text-files/index.stories.js +32 -0
  304. package/src/ui.text-files/index.vue +87 -0
  305. package/src/ui.text-header/Docs.mdx +16 -0
  306. package/src/ui.text-header/composables/attrs.composable.js +34 -0
  307. package/src/ui.text-header/constants/index.js +5 -0
  308. package/src/ui.text-header/index.stories.js +106 -0
  309. package/src/ui.text-header/index.vue +83 -0
  310. package/src/ui.text-money/Docs.mdx +16 -0
  311. package/src/ui.text-money/assets/credit.svg +7 -0
  312. package/src/ui.text-money/assets/debit.svg +12 -0
  313. package/src/ui.text-money/composables/attrs.composable.js +65 -0
  314. package/src/ui.text-money/constants/index.js +7 -0
  315. package/src/ui.text-money/index.stories.js +265 -0
  316. package/src/ui.text-money/index.vue +204 -0
  317. package/src/ui.text-money/services/money.services.js +24 -0
  318. package/src/ui.viewport/index.vue +78 -0
@@ -0,0 +1,719 @@
1
+ <template>
2
+ <ULabel
3
+ ref="labelComponentRef"
4
+ :for="id"
5
+ :size="size"
6
+ :label="label"
7
+ :error="errorMessage"
8
+ :description="descriptionMessage"
9
+ :align="labelAlign"
10
+ :disabled="disabled"
11
+ :data-cy="dataCy"
12
+ v-bind="labelAttrs"
13
+ >
14
+ <div
15
+ ref="wrapperRef"
16
+ :tabindex="searchable ? -1 : 0"
17
+ role="combobox"
18
+ :aria-owns="'listbox-' + id"
19
+ v-bind="wrapperAttrs"
20
+ @focus="activate"
21
+ @blur="deactivate"
22
+ @keydown.self.down.prevent="dropdownListRef.pointerForward"
23
+ @keydown.self.up.prevent="dropdownListRef.pointerBackward"
24
+ @keydown.enter.tab.stop.self="dropdownListRef.addPointerElement"
25
+ @keyup.esc="deactivate"
26
+ >
27
+ <div
28
+ v-if="hasSlotContent($slots['after-caret']) && !(multiple && localValue.length)"
29
+ v-bind="afterCaretSlotAttrs"
30
+ >
31
+ <!-- @slot Use it to add something after caret. -->
32
+ <slot :scope-props="props" name="after-caret" />
33
+ </div>
34
+
35
+ <div
36
+ v-show="!multiple || (!isLocalValue && multiple)"
37
+ v-bind="caretToggleAttrs"
38
+ @mousedown.prevent.stop="toggle"
39
+ >
40
+ <UIcon
41
+ interactive
42
+ color="gray"
43
+ :size="size"
44
+ :name="config.iconToggleName"
45
+ v-bind="iconToggleAttrs"
46
+ />
47
+ </div>
48
+
49
+ <div
50
+ v-if="hasSlotContent($slots['before-caret']) && !(multiple && localValue.length)"
51
+ v-bind="beforeCaretSlotAttrs"
52
+ >
53
+ <!-- @slot Use it to add something after caret. -->
54
+ <slot :scope-props="props" name="before-caret" />
55
+ </div>
56
+
57
+ <div v-if="isLocalValue && !noClear && !disabled && !multiple" v-bind="caretClearAttrs">
58
+ <UIcon
59
+ interactive
60
+ color="gray"
61
+ :size="size"
62
+ :name="config.iconClearName"
63
+ v-bind="iconClearAttrs"
64
+ @mousedown="removeElement"
65
+ />
66
+ </div>
67
+
68
+ <div ref="innerWrapperRef" v-bind="innerWrapperAttrs">
69
+ <div v-if="multiple" v-bind="selectedLabelsAttrs">
70
+ <span v-for="item in localValue" :key="item[valueKey]" v-bind="selectedLabelAttrs">
71
+ <!-- @slot Use it to add selected value label. -->
72
+ <slot
73
+ name="selected-label"
74
+ :selected-label="getOptionLabel(item)"
75
+ :value="item[valueKey]"
76
+ :raw-option="item"
77
+ >
78
+ {{ getOptionLabel(item) }}
79
+ </slot>
80
+
81
+ <!-- @slot Use it to add selected value label. -->
82
+ <slot :scope-props="props" name="selected-label-after" />
83
+
84
+ <div
85
+ v-if="!disabled"
86
+ v-bind="caretRemoveItemAttrs"
87
+ @mousedown.prevent.capture
88
+ @click.prevent.capture
89
+ >
90
+ <UIcon
91
+ interactive
92
+ color="gray"
93
+ :size="size"
94
+ :name="config.iconRemoveItemName"
95
+ v-bind="iconRemoveItemAttrs"
96
+ @mousedown="removeElement(item)"
97
+ />
98
+ </div>
99
+ </span>
100
+ </div>
101
+
102
+ <div v-bind="searchAttrs">
103
+ <span
104
+ v-if="hasSlotContent($slots['left'])"
105
+ ref="leftSlotWrapperRef"
106
+ v-bind="leftSlotAttrs"
107
+ >
108
+ <!-- @slot Use it to add some component before text. -->
109
+ <slot name="left" />
110
+ </span>
111
+
112
+ <input
113
+ v-show="searchable || !localValue || multiple || !isOpen"
114
+ :id="id"
115
+ ref="searchInputRef"
116
+ v-model="search"
117
+ :name="name"
118
+ type="text"
119
+ autocomplete="off"
120
+ :spellcheck="false"
121
+ :placeholder="inputPlaceholder"
122
+ :value="search"
123
+ :disabled="disabled"
124
+ :aria-controls="'listbox-' + id"
125
+ v-bind="searchInputAttrs"
126
+ @focus="activate"
127
+ @blur.prevent="deactivate"
128
+ @keyup.esc="deactivate"
129
+ @keydown.down.prevent="dropdownListRef.pointerForward"
130
+ @keydown.up.prevent="dropdownListRef.pointerBackward"
131
+ @keydown.enter.prevent.stop.self="dropdownListRef.addPointerElement"
132
+ />
133
+ </div>
134
+
135
+ <span
136
+ v-if="isSelectedValueLabelVisible"
137
+ v-bind="selectedLabelAttrs"
138
+ @mousedown.prevent="toggle"
139
+ >
140
+ <!-- @slot Use it to add selected value label. -->
141
+ <slot name="selected-label" :selected-label="selectedLabel" :value="localValue[valueKey]">
142
+ {{ selectedLabel }}
143
+ </slot>
144
+
145
+ <!-- @slot Use it to add selected value label. -->
146
+ <slot :scope-props="props" name="selected-label-after" />
147
+ </span>
148
+
149
+ <div
150
+ v-if="isLocalValue && !noClear && !disabled && multiple"
151
+ v-bind="caretClearTextAttrs"
152
+ @mousedown.prevent.capture="removeElement(localValue)"
153
+ @click.prevent.capture
154
+ v-text="config.i18n.clear"
155
+ />
156
+ </div>
157
+
158
+ <UDropdownList
159
+ v-show="isOpen"
160
+ ref="dropdownListRef"
161
+ v-model="dropdownValue"
162
+ :options="filteredOptions"
163
+ :disabled
164
+ :size
165
+ :max-height="optimizedHeight"
166
+ :option-height="optionHeight"
167
+ :value-key
168
+ :label-key
169
+ :add-option
170
+ tabindex="-1"
171
+ v-bind="dropdownListAttrs"
172
+ @focus="activate"
173
+ @addOption="onAddOption"
174
+ @mousedown.prevent.capture
175
+ @click.prevent.capture
176
+ >
177
+ <template #before-option="{ option }">
178
+ <!-- @slot Use it to add something before option. -->
179
+ <slot :option="option" name="before-option" />
180
+ </template>
181
+
182
+ <template #option="{ option, index }">
183
+ <slot name="option" :option="option" :index="index" />
184
+ </template>
185
+
186
+ <template #after-option="{ option }">
187
+ <!-- @slot Use it to add something after option. -->
188
+ <slot :option="option" name="after-option" />
189
+ </template>
190
+
191
+ <template #empty="{ emptyStyles }">
192
+ <span v-show="isEmpty" :class="emptyStyles" v-text="config.i18n.listIsEmpty" />
193
+ <span
194
+ v-show="options.length === 0 && !search && !isEmpty"
195
+ :class="emptyStyles"
196
+ v-text="config.i18n.noDataToShow"
197
+ />
198
+ </template>
199
+ </UDropdownList>
200
+ </div>
201
+ </ULabel>
202
+ </template>
203
+
204
+ <script setup>
205
+ import { ref, computed, nextTick, watch, useSlots, onMounted } from "vue";
206
+ import { debounce } from "lodash-es";
207
+
208
+ import UIService, { getRandomId, isMac } from "../service.ui";
209
+
210
+ import SelectService from "./services/select.service";
211
+ import useAttrs from "./composables/attrs.composable";
212
+ import defaultConfig from "./configs/default.config";
213
+ import { USelect, DIRECTION, KEY_CODES } from "./constants";
214
+
215
+ /* Should be a string for correct web-types gen */
216
+ defineOptions({ name: "USelect", inheritAttrs: false });
217
+
218
+ const props = defineProps({
219
+ /**
220
+ * Select value.
221
+ */
222
+ modelValue: {
223
+ type: [String, Number, Array],
224
+ default: "",
225
+ },
226
+
227
+ /**
228
+ * Select options.
229
+ */
230
+ options: {
231
+ type: Array,
232
+ default: () => [],
233
+ },
234
+
235
+ /**
236
+ * Select label.
237
+ */
238
+ label: {
239
+ type: String,
240
+ default: "",
241
+ },
242
+
243
+ /**
244
+ * Show label outside the select block.
245
+ */
246
+ labelOutside: {
247
+ type: Boolean,
248
+ default: UIService.get(defaultConfig, USelect).default.labelOutside,
249
+ },
250
+
251
+ /**
252
+ * Select placeholder.
253
+ */
254
+ placeholder: {
255
+ type: String,
256
+ default: "",
257
+ },
258
+
259
+ /**
260
+ * Select description.
261
+ */
262
+ description: {
263
+ type: String,
264
+ default: "",
265
+ },
266
+
267
+ /**
268
+ * Select error message.
269
+ */
270
+ error: {
271
+ type: String,
272
+ default: "",
273
+ },
274
+
275
+ /**
276
+ * Select size.
277
+ * @values sm, md, lg
278
+ */
279
+ size: {
280
+ type: String,
281
+ default: UIService.get(defaultConfig, USelect).default.size,
282
+ },
283
+
284
+ /**
285
+ * Select open direction.
286
+ * @values auto, top, bottom
287
+ */
288
+ openDirection: {
289
+ type: String,
290
+ default: UIService.get(defaultConfig, USelect).default.openDirection,
291
+ },
292
+
293
+ /**
294
+ * Label key in the item object of options.
295
+ */
296
+ labelKey: {
297
+ type: String,
298
+ default: UIService.get(defaultConfig, USelect).default.labelKey,
299
+ },
300
+
301
+ /**
302
+ * Value key in the item object of options.
303
+ */
304
+ valueKey: {
305
+ type: String,
306
+ default: UIService.get(defaultConfig, USelect).default.valueKey,
307
+ },
308
+
309
+ /**
310
+ * Set a name of the property containing the group label.
311
+ */
312
+ // TODO: groupLabelKey ???
313
+ groupLabel: {
314
+ type: String,
315
+ default: "label",
316
+ },
317
+
318
+ /**
319
+ * Set a name of the property containing the group values.
320
+ */
321
+ // TODO: groupValueKey ???
322
+ groupValues: {
323
+ type: String,
324
+ default: "",
325
+ },
326
+
327
+ /**
328
+ * name attribute to match optional label element.
329
+ */
330
+ // TODO: what is it?
331
+ name: {
332
+ type: String,
333
+ default: "",
334
+ },
335
+
336
+ /**
337
+ * Number of options displayed in the dropdown.
338
+ */
339
+ optionsLimit: {
340
+ type: Number,
341
+ default: UIService.get(defaultConfig, USelect).default.optionsLimit,
342
+ },
343
+
344
+ /**
345
+ * Sets maxHeight style value of the dropdown
346
+ */
347
+ // TODO: Should be in option amount not in pixels (option may have be different height)
348
+ maxHeight: {
349
+ type: Number,
350
+ default: UIService.get(defaultConfig, USelect).default.maxHeight,
351
+ },
352
+
353
+ // TODO: there is no desc
354
+ optionHeight: {
355
+ type: Number,
356
+ default: UIService.get(defaultConfig, USelect).default.optionHeight,
357
+ },
358
+
359
+ /**
360
+ * Allow clearing selected value.
361
+ */
362
+ noClear: {
363
+ type: Boolean,
364
+ default: UIService.get(defaultConfig, USelect).default.noClear,
365
+ },
366
+
367
+ /**
368
+ * Allows multiple selection.
369
+ */
370
+ multiple: {
371
+ type: Boolean,
372
+ default: UIService.get(defaultConfig, USelect).default.multiple,
373
+ },
374
+
375
+ /**
376
+ * Allows to search value in a list.
377
+ */
378
+ searchable: {
379
+ type: Boolean,
380
+ default: UIService.get(defaultConfig, USelect).default.searchable,
381
+ },
382
+
383
+ /**
384
+ * Disable the select.
385
+ */
386
+ disabled: {
387
+ type: Boolean,
388
+ default: UIService.get(defaultConfig, USelect).default.disabled,
389
+ },
390
+
391
+ /**
392
+ * Show "Add new option" button in the list.
393
+ */
394
+ addOption: {
395
+ type: Boolean,
396
+ default: UIService.get(defaultConfig, USelect).default.addOption,
397
+ },
398
+
399
+ /**
400
+ * Generates unique element id.
401
+ * @ignore
402
+ */
403
+ id: {
404
+ type: String,
405
+ default: () => getRandomId(),
406
+ },
407
+
408
+ /**
409
+ * Component ui config object.
410
+ */
411
+ config: {
412
+ type: Object,
413
+ default: () => ({}),
414
+ },
415
+
416
+ /**
417
+ * Data-cy attribute for automated testing.
418
+ */
419
+ dataCy: {
420
+ type: String,
421
+ default: "",
422
+ },
423
+ });
424
+
425
+ const emit = defineEmits([
426
+ "open",
427
+ "close",
428
+ "searchChange",
429
+ "remove",
430
+ "update:modelValue",
431
+ "select",
432
+ "addOption",
433
+ "change",
434
+ ]);
435
+
436
+ const slots = useSlots();
437
+
438
+ const isOpen = ref(false);
439
+ const preferredOpenDirection = ref(DIRECTION.bottom);
440
+ const search = ref("");
441
+ const optimizedHeight = ref(props.maxHeight);
442
+
443
+ const dropdownListRef = ref(null);
444
+ const wrapperRef = ref(null);
445
+ const searchInputRef = ref(null);
446
+ const labelComponentRef = ref(null);
447
+ const leftSlotWrapperRef = ref(null);
448
+ const innerWrapperRef = ref(null);
449
+
450
+ const isTop = computed(() => {
451
+ if (props.openDirection === DIRECTION.top) return true;
452
+ if (props.openDirection === DIRECTION.bottom) return false;
453
+
454
+ return preferredOpenDirection.value === DIRECTION.top;
455
+ });
456
+
457
+ const selectedLabel = computed(() => {
458
+ return isLocalValue.value ? getOptionLabel(localValue.value) : "";
459
+ });
460
+
461
+ const {
462
+ config,
463
+ hasSlotContent,
464
+ labelAttrs,
465
+ wrapperAttrs,
466
+ innerWrapperAttrs,
467
+ leftSlotAttrs,
468
+ beforeCaretSlotAttrs,
469
+ afterCaretSlotAttrs,
470
+ caretToggleAttrs,
471
+ iconToggleAttrs,
472
+ caretClearAttrs,
473
+ caretClearTextAttrs,
474
+ iconClearAttrs,
475
+ caretRemoveItemAttrs,
476
+ iconRemoveItemAttrs,
477
+ searchAttrs,
478
+ searchInputAttrs,
479
+ selectedLabelsAttrs,
480
+ selectedLabelAttrs,
481
+ dropdownListAttrs,
482
+ } = useAttrs(props, { isTop, isOpen, selectedLabel });
483
+
484
+ const inputPlaceholder = computed(() => {
485
+ return props.multiple && localValue.value.length ? config.value.i18n.addMore : props.placeholder;
486
+ });
487
+
488
+ const dropdownValue = computed({
489
+ get: () => props.modelValue,
490
+ set: (newValue) => {
491
+ let value = newValue;
492
+
493
+ if (props.multiple) {
494
+ value = Array.isArray(props.modelValue) ? [...props.modelValue, newValue] : [newValue];
495
+ }
496
+
497
+ emit("update:modelValue", value);
498
+ deactivate();
499
+ },
500
+ });
501
+
502
+ const isSelectedValueLabelVisible = computed(() => {
503
+ return !props.multiple && isLocalValue.value && (!isOpen.value || !props.searchable);
504
+ });
505
+
506
+ const labelAlign = computed(() => {
507
+ return props.labelOutside ? "top" : "topInside";
508
+ });
509
+
510
+ const filteredOptions = computed(() => {
511
+ const normalizedSearch = search.value.toLowerCase().trim();
512
+
513
+ let options = props.multiple
514
+ ? SelectService.removeSelectedValues(
515
+ props.options,
516
+ props.groupValues,
517
+ props.valueKey,
518
+ props.modelValue,
519
+ )
520
+ : [...props.options];
521
+
522
+ options = props.groupValues
523
+ ? filterAndFlat(options, normalizedSearch, props.labelKey)
524
+ : SelectService.filterOptions(options, normalizedSearch, props.labelKey);
525
+
526
+ return options.slice(0, props.optionsLimit);
527
+ });
528
+
529
+ const localValue = computed(() => {
530
+ if (!props.multiple) {
531
+ return SelectService.getCurrentOption(
532
+ props.modelValue,
533
+ props.options,
534
+ props.groupValues,
535
+ props.valueKey,
536
+ );
537
+ }
538
+
539
+ return props.modelValue
540
+ ? props.modelValue.map((item) =>
541
+ SelectService.getCurrentOption(item, props.options, props.groupValues, props.valueKey),
542
+ )
543
+ : [];
544
+ });
545
+
546
+ const isEmpty = computed(() => {
547
+ return (
548
+ (filteredOptions.value.length === 0 && search) ||
549
+ (props.multiple && localValue.value.length === props.options.length)
550
+ );
551
+ });
552
+
553
+ const isLocalValue = computed(() => {
554
+ if (props.multiple) return Boolean(localValue.value.length);
555
+
556
+ return typeof localValue.value !== "number"
557
+ ? Boolean(localValue.value)
558
+ : Boolean(String(localValue.value));
559
+ });
560
+
561
+ const errorMessage = computed(() => {
562
+ return !isOpen.value && props.error ? props.error : "";
563
+ });
564
+
565
+ const descriptionMessage = computed(() => {
566
+ return !isOpen.value && props.description ? props.description : "";
567
+ });
568
+
569
+ watch(search, () => onSearchChange);
570
+ watch(
571
+ localValue,
572
+ () => {
573
+ setLabelPosition();
574
+ emit("change");
575
+ },
576
+ { deep: true },
577
+ );
578
+
579
+ if (props.addOption) {
580
+ document.addEventListener("keydown", onKeydownAddOption);
581
+ }
582
+
583
+ onMounted(() => setLabelPosition());
584
+
585
+ const onSearchChange = debounce(async function (query) {
586
+ emit("searchChange", query);
587
+ }, 300);
588
+
589
+ function getOptionLabel(option) {
590
+ if (!option) return "";
591
+ if (option.$isLabel) return option.$groupLabel;
592
+
593
+ return option[props.labelKey] || "";
594
+ }
595
+
596
+ function onKeydownAddOption(event) {
597
+ if (!isOpen.value) return;
598
+
599
+ const isEnter = event.keyCode === KEY_CODES.enter;
600
+ const isCtrl = event.ctrlKey;
601
+ const isMeta = event.metaKey;
602
+
603
+ if (isMeta && isEnter && isMac) {
604
+ emit("addOption");
605
+ }
606
+
607
+ if (isEnter && isCtrl && !isMac) {
608
+ emit("addOption");
609
+ }
610
+ }
611
+
612
+ function onAddOption() {
613
+ emit("addOption");
614
+ }
615
+
616
+ function filterAndFlat(options, search, label) {
617
+ const filteredGroups = SelectService.filterGroups(
618
+ options,
619
+ search,
620
+ label,
621
+ props.groupValues,
622
+ props.groupLabel,
623
+ );
624
+
625
+ return SelectService.flattenOptions(filteredGroups, props.groupValues, props.groupLabel);
626
+ }
627
+
628
+ function toggle() {
629
+ isOpen.value ? deactivate() : activate();
630
+ }
631
+
632
+ function deactivate() {
633
+ if (!isOpen.value) return;
634
+
635
+ props.searchable && searchInputRef.value ? searchInputRef.value.blur() : wrapperRef.value?.blur();
636
+
637
+ search.value = "";
638
+ isOpen.value = false;
639
+
640
+ nextTick(() => emit("close", localValue.value, props.id));
641
+ }
642
+
643
+ function activate() {
644
+ if (props.isOpen || props.disabled) return;
645
+
646
+ adjustPosition();
647
+
648
+ isOpen.value = true;
649
+
650
+ if (props.searchable) {
651
+ search.value = "";
652
+
653
+ nextTick(() => searchInputRef.value && searchInputRef.value.focus());
654
+ }
655
+
656
+ if (wrapperRef.value !== undefined && !props.searchable) wrapperRef.value.focus();
657
+
658
+ emit("open", props.id);
659
+ }
660
+
661
+ function adjustPosition() {
662
+ if (typeof window === "undefined") return;
663
+
664
+ const spaceAbove = wrapperRef.value.getBoundingClientRect().top;
665
+ const spaceBelow = window.innerHeight - wrapperRef.value.getBoundingClientRect().bottom;
666
+ const hasEnoughSpaceBelow = spaceBelow > props.maxHeight;
667
+
668
+ if (hasEnoughSpaceBelow || spaceBelow > spaceAbove || props.openDirection === DIRECTION.bottom) {
669
+ preferredOpenDirection.value = DIRECTION.bottom;
670
+ // TODO: magic numbers
671
+ optimizedHeight.value = Math.min(spaceBelow - 40, props.maxHeight);
672
+ } else {
673
+ preferredOpenDirection.value = DIRECTION.top;
674
+ optimizedHeight.value = Math.min(spaceAbove - 40, props.maxHeight);
675
+ }
676
+ }
677
+
678
+ function removeElement(option, shouldClose = true) {
679
+ if (props.disabled) return;
680
+ if (option.$isDisabled) return;
681
+
682
+ if (props.noClear && !props.multiple) {
683
+ deactivate();
684
+
685
+ return;
686
+ }
687
+
688
+ let value = "";
689
+
690
+ if (props.multiple) {
691
+ value = !Array.isArray(option)
692
+ ? [...props.modelValue].filter((item) => item !== option[props.valueKey])
693
+ : [];
694
+ }
695
+
696
+ emit("update:modelValue", value);
697
+ emit("remove", option, props.id);
698
+
699
+ if (shouldClose) {
700
+ deactivate();
701
+ }
702
+ }
703
+
704
+ function setLabelPosition() {
705
+ if (props.labelOutside || !hasSlotContent(slots["left"])) return;
706
+
707
+ const leftSlotWidth = leftSlotWrapperRef.value.getBoundingClientRect().width;
708
+ const innerWrapperPaddingLeft = parseInt(
709
+ window.getComputedStyle(innerWrapperRef.value).paddingLeft,
710
+ );
711
+
712
+ if (props.multiple && localValue.value.length >= 1) {
713
+ labelComponentRef.value.labelElement.style.left = `${leftSlotWidth - innerWrapperPaddingLeft}px`;
714
+ leftSlotWrapperRef.value.classList.remove("group-[]/placement-inside:-mt-4");
715
+ } else {
716
+ labelComponentRef.value.labelElement.style.left = `${leftSlotWidth + innerWrapperPaddingLeft}px`;
717
+ }
718
+ }
719
+ </script>