vueless 0.0.4 → 0.0.6

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