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,284 @@
1
+ <template>
2
+ <div
3
+ ref="wrapperRef"
4
+ tabindex="1"
5
+ :style="{ maxHeight: wrapperHeight }"
6
+ v-bind="wrapperAttrs"
7
+ @keydown.self.down.prevent="pointerForward"
8
+ @keydown.self.up.prevent="pointerBackward"
9
+ @keydown.enter.tab.stop.self="addPointerElement"
10
+ >
11
+ <ul :id="`listbox-${id}`" v-bind="listAttrs" role="listbox">
12
+ <li
13
+ v-for="(option, index) of options"
14
+ :id="`${id}-${index}`"
15
+ :key="index"
16
+ :role="!(option && (option.$isLabel || option.$isDisabled)) ? 'option' : null"
17
+ v-bind="optionItemAttrs"
18
+ >
19
+ <!-- option title -->
20
+ <span
21
+ v-if="
22
+ !(option && (option.$isLabel || option.$isDisabled || option.isSubGroup)) &&
23
+ !option.isHidden
24
+ "
25
+ v-bind="optionAttrs(optionHighlight(index, option))"
26
+ @click.stop="select(option)"
27
+ @mouseenter.self="pointerSet(index)"
28
+ >
29
+ <!-- @slot Use it to add something before option. -->
30
+ <slot :option="option" name="before-option" />
31
+
32
+ <slot name="option" :option="option" :index="index">
33
+ <span
34
+ :style="getMarginForSubCategory(option.level)"
35
+ v-bind="optionContentAttrs"
36
+ v-text="option[labelKey]"
37
+ />
38
+ </slot>
39
+
40
+ <!-- @slot Use it to add something after option. -->
41
+ <slot :option="option" name="after-option" />
42
+ </span>
43
+
44
+ <!-- group title -->
45
+ <div
46
+ v-if="
47
+ option &&
48
+ (option.$isLabel || option.$isDisabled || option.isSubGroup) &&
49
+ !option.isHidden
50
+ "
51
+ >
52
+ <div v-if="option.$groupLabel" v-bind="groupLabelAttrs" v-text="option.$groupLabel" />
53
+
54
+ <div
55
+ v-else-if="option.isSubGroup"
56
+ :style="getMarginForSubCategory(option.level)"
57
+ v-bind="subGroupLabelAttrs"
58
+ v-text="option[labelKey]"
59
+ />
60
+ </div>
61
+ </li>
62
+ <slot
63
+ v-if="hasSlotContent($slots['empty']) || options.length === 0"
64
+ name="empty"
65
+ :empty-styles="optionClasses"
66
+ >
67
+ <span v-bind="optionAttrs()">
68
+ <span v-text="config.i18n.noDataToShow" />
69
+ </span>
70
+ </slot>
71
+
72
+ <!-- Add button -->
73
+ <template v-if="addOption">
74
+ <div v-bind="addTitleWrapperAttrs" @click="onClickAddOption">
75
+ <div v-bind="addTitleAttrs">
76
+ {{ config.i18n.add }}
77
+ <span v-bind="addTitleHotkeyAttrs" v-text="addOptionKeyCombination" />
78
+ </div>
79
+ </div>
80
+ <UButton pill square v-bind="buttonAddAttrs" @click="onClickAddOption">
81
+ <UIcon color="white" size="xs" :name="config.iconAddName" v-bind="iconAddAttrs" />
82
+ </UButton>
83
+ </template>
84
+ </ul>
85
+ </div>
86
+ </template>
87
+
88
+ <script setup>
89
+ import { computed, ref } from "vue";
90
+
91
+ import UIcon from "../ui.image-icon";
92
+ import UButton from "../ui.button";
93
+
94
+ import UIService, { getRandomId, isMac } from "../service.ui";
95
+
96
+ import usePointer from "./composables/usePointer";
97
+ import useAttrs from "./composables/attrs.composable";
98
+ import defaultConfig from "./configs/default.config.js";
99
+ import { UDropdownList } from "./constants";
100
+
101
+ /* Should be a string for correct web-types gen */
102
+ defineOptions({ name: "UDropdownList", inheritAttrs: false });
103
+
104
+ // TODO: Use props and regular modal value
105
+ const modelValue = defineModel({ type: [String, Number, Object], default: "" });
106
+
107
+ const props = defineProps({
108
+ /**
109
+ * Set options list.
110
+ */
111
+ options: {
112
+ type: Array,
113
+ default: () => [],
114
+ },
115
+
116
+ /**
117
+ * Label key in the item object of options.
118
+ */
119
+ labelKey: {
120
+ type: String,
121
+ default: "label",
122
+ },
123
+
124
+ /**
125
+ * Value key in the item object of options.
126
+ */
127
+ valueKey: {
128
+ type: String,
129
+ default: "id",
130
+ },
131
+
132
+ /**
133
+ * Set a name of the property containing the group label.
134
+ */
135
+ groupLabel: {
136
+ type: String,
137
+ default: "label",
138
+ },
139
+
140
+ /**
141
+ * Set a name of the property containing the group values.
142
+ */
143
+ groupValues: {
144
+ type: String,
145
+ default: "",
146
+ },
147
+
148
+ /**
149
+ * Show add new option button to the list.
150
+ */
151
+ addOption: {
152
+ type: Boolean,
153
+ default: false,
154
+ },
155
+
156
+ /**
157
+ * Disables the select.
158
+ */
159
+ disabled: {
160
+ type: Boolean,
161
+ default: UIService.get(defaultConfig, UDropdownList).default.disabled,
162
+ },
163
+
164
+ /**
165
+ * Set size.
166
+ * @values sm, md, lg
167
+ */
168
+ size: {
169
+ type: String,
170
+ default: UIService.get(defaultConfig, UDropdownList).default.size,
171
+ },
172
+
173
+ /**
174
+ * List max height in pixels.
175
+ */
176
+ maxHeight: {
177
+ type: [Number, String],
178
+ default: UIService.get(defaultConfig, UDropdownList).default.maxHeight,
179
+ },
180
+
181
+ /**
182
+ * List option height in pixels.
183
+ */
184
+ optionHeight: {
185
+ type: Number,
186
+ default: UIService.get(defaultConfig, UDropdownList).default.optionHeight,
187
+ },
188
+
189
+ /**
190
+ * Generates unique element id.
191
+ * @ignore
192
+ */
193
+ id: {
194
+ type: String,
195
+ default: () => getRandomId(),
196
+ },
197
+
198
+ /**
199
+ * Sets component ui config object.
200
+ */
201
+ config: {
202
+ type: Object,
203
+ default: () => ({}),
204
+ },
205
+ });
206
+
207
+ const emit = defineEmits(["update:modelValue", "addOption"]);
208
+
209
+ const wrapperRef = ref(null);
210
+
211
+ const { pointer, pointerDirty, pointerSet, pointerBackward, pointerForward, pointerReset } =
212
+ usePointer(props.options, props.optionHeight, wrapperRef);
213
+
214
+ const {
215
+ config,
216
+ hasSlotContent,
217
+ wrapperAttrs,
218
+ listAttrs,
219
+ optionItemAttrs,
220
+ addTitleWrapperAttrs,
221
+ addTitleAttrs,
222
+ addTitleHotkeyAttrs,
223
+ buttonAddAttrs,
224
+ iconAddAttrs,
225
+ optionAttrs,
226
+ subGroupLabelAttrs,
227
+ groupLabelAttrs,
228
+ optionClasses,
229
+ optionContentAttrs,
230
+ } = useAttrs(props);
231
+
232
+ defineExpose({ pointerSet, pointerBackward, pointerForward, pointerReset, addPointerElement });
233
+
234
+ const addOptionKeyCombination = computed(() => {
235
+ return isMac ? "(⌘ + Enter)" : "(Ctrl + Enter)";
236
+ });
237
+
238
+ const wrapperHeight = computed(() =>
239
+ props.maxHeight === undefined ? "auto" : `${props.maxHeight}px`,
240
+ );
241
+
242
+ function onClickAddOption() {
243
+ emit("addOption");
244
+ }
245
+
246
+ function select(option, key) {
247
+ if (props.disabled || option.$isDisabled || option.$isLabel) {
248
+ return;
249
+ }
250
+
251
+ if (key === "Tab" && !pointerDirty.value) return;
252
+
253
+ modelValue.value = option[props.valueKey];
254
+ }
255
+
256
+ function isSelectedOption(option) {
257
+ return modelValue.value === option[props.valueKey];
258
+ }
259
+
260
+ function getMarginForSubCategory(level) {
261
+ const baseMargin = 1;
262
+
263
+ if (level > 1) {
264
+ return `margin-left: ${baseMargin * (level - 1)}rem`;
265
+ }
266
+ }
267
+
268
+ function optionHighlight(index, option) {
269
+ const classes = [];
270
+
271
+ if (index === pointer.value) classes.push(config.value.optionHighlight);
272
+ if (isSelectedOption(option)) classes.push(config.value.optionSelected);
273
+
274
+ return classes;
275
+ }
276
+
277
+ function addPointerElement({ key } = "Enter") {
278
+ if (props.options.length > 0) {
279
+ select(props.options[pointer.value], key);
280
+ }
281
+
282
+ pointerReset();
283
+ }
284
+ </script>
@@ -0,0 +1,52 @@
1
+ import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Source, Markdown } from "@storybook/blocks";
2
+ import { getSource } from "../service.storybook";
3
+
4
+ import * as stories from "./index.stories";
5
+ import defaultConfig from "./configs/default.config?raw"
6
+
7
+ <Meta of={stories} />
8
+ <Title of={stories} />
9
+ <Subtitle of={stories} />
10
+ <Description of={stories} />
11
+ <Primary of={stories} />
12
+ <Controls of={stories.Default} />
13
+ <Stories of={stories} />
14
+
15
+ ## **Default config**
16
+ <Source code={getSource(defaultConfig)} language="jsx" dark />
17
+
18
+ ## Formatting tokens
19
+ Each character in the table below can be used in `dateFormat` and `userFormat` options to achieve the format you need.
20
+
21
+ <Markdown>
22
+ {`
23
+ | Token | Description | Example |
24
+ | ----- | --------------------------------------------------------- | ------------------------------------------------------------- |
25
+ | d | Day of the month, 2 digits with leading zeros | 01 to 31 |
26
+ | D | A textual representation of a day | Mon through Sun |
27
+ | l | A full textual representation of the day of the week | Sunday through Saturday |
28
+ | j | Day of the month without leading zeros | 1 to 31 |
29
+ | J | Day of the month without leading zeros and ordinal suffix | 1st, 2nd, to 31st |
30
+ | w | Numeric representation of the day of the week | 0 (for Sunday) through 6 (for Saturday) |
31
+ | W | Numeric representation of the week | 0 (first week of the year) through 52 (last week of the year) |
32
+ | F | A full textual representation of a month | January through December |
33
+ | m | Numeric representation of a month, with leading zero | 01 through 12 |
34
+ | n | Numeric representation of a month, without leading zeros | 1 through 12 |
35
+ | M | A short textual representation of a month | Jan through Dec |
36
+ | U | A short textual representation of a month | 1413704993 |
37
+ | y | A two-digit representation of a year | 99 or 03 |
38
+ | Y | A full numeric representation of a year, 4 digits | 1999 or 2003 |
39
+ | Z | ISO Date format | 2017-03-04T01:23:43.000Z |
40
+ | H | Hours (24 hours) | 00 to 23 |
41
+ | h | Hours | 1 to 12 |
42
+ | G | Hours, 2 digits with leading zeros | 1 to 12 |
43
+ | i | Minutes | 00 to 59 |
44
+ | S | Seconds, 2 digits | 00 to 59 |
45
+ | s | Seconds | 0, 1 to 59 |
46
+ `}
47
+ </Markdown>
48
+
49
+ ## Escaping Formatting Tokens
50
+ You may escape formatting tokens using \\\\.
51
+
52
+ <Source code={`dateFormat: "Y-m-d\\Z", // Displays: 2017-01-22Z`} language="jsx" dark />
@@ -0,0 +1,268 @@
1
+ <template>
2
+ <div v-bind="dayViewWrapperAttrs">
3
+ <div v-bind="weekDaysWrapperAttrs">
4
+ <span v-for="weekDay in weekdays" :key="weekDay" v-bind="weekDayAttrs" v-text="weekDay" />
5
+ </div>
6
+ <div v-bind="daysWrapperAttrs">
7
+ <button
8
+ v-for="day in days"
9
+ :key="day"
10
+ tabindex="-1"
11
+ :disabled="dateIsOutOfRange(day, minDate, maxDate, locale, dateFormat)"
12
+ v-bind="dayAttrs(getDayClasses(day))"
13
+ @mousedown.prevent.capture
14
+ @click="onClickDay(day)"
15
+ v-text="formatDate(day, 'j', locale)"
16
+ />
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script setup>
22
+ import { computed } from "vue";
23
+
24
+ import { formatDate, dateIsOutOfRange } from "../services/calendar.service";
25
+ import {
26
+ isToday,
27
+ getDateWithoutTime,
28
+ getLastDayOfMonth,
29
+ isSameDay,
30
+ isAnotherMothDay,
31
+ } from "../services/date.service";
32
+
33
+ import useAttrs from "../composables/attrs.composable";
34
+
35
+ import { DAYS_IN_WEEK, START_WEEK } from "../constants";
36
+
37
+ const props = defineProps({
38
+ selectedDate: {
39
+ type: [Date, null],
40
+ required: true,
41
+ },
42
+
43
+ selectedDateTo: {
44
+ type: [Date, null],
45
+ default: undefined,
46
+ },
47
+
48
+ activeDate: {
49
+ type: [Date, null],
50
+ required: true,
51
+ },
52
+
53
+ activeMonth: {
54
+ type: [Date, null],
55
+ required: true,
56
+ },
57
+
58
+ locale: {
59
+ type: Object,
60
+ required: true,
61
+ },
62
+
63
+ dateFormat: {
64
+ type: String,
65
+ required: true,
66
+ },
67
+
68
+ range: {
69
+ type: Boolean,
70
+ default: false,
71
+ },
72
+
73
+ maxDate: {
74
+ type: [Date, String],
75
+ default: undefined,
76
+ },
77
+
78
+ minDate: {
79
+ type: [Date, String],
80
+ default: undefined,
81
+ },
82
+
83
+ config: {
84
+ type: Object,
85
+ default: () => ({}),
86
+ },
87
+ });
88
+
89
+ const emit = defineEmits(["input"]);
90
+
91
+ const {
92
+ dayViewWrapperAttrs,
93
+ weekDaysWrapperAttrs,
94
+ weekDayAttrs,
95
+ daysWrapperAttrs,
96
+ activeDayAttrs,
97
+ selectedDayAttrs,
98
+ currentDayAttrs,
99
+ anotherMonthDayAttrs,
100
+ dayAttrs,
101
+ inRangeFirstDayAttrs,
102
+ inRangeLastDayAttrs,
103
+ inRangeDayAttrs,
104
+ } = useAttrs(props);
105
+
106
+ const localSelectedDate = computed(() => {
107
+ return props.selectedDate === null ? getDateWithoutTime() : props.selectedDate;
108
+ });
109
+
110
+ const activeMonthDate = computed(() => {
111
+ return props.activeMonth || localSelectedDate.value;
112
+ });
113
+
114
+ const firstDayOfMonth = computed(() => {
115
+ const date = new Date(activeMonthDate.value.valueOf());
116
+
117
+ date.setDate(1);
118
+
119
+ return date;
120
+ });
121
+
122
+ const lastDayOfMonth = computed(() => {
123
+ return getLastDayOfMonth(activeMonthDate.value);
124
+ });
125
+
126
+ const firstDayOfPrevMonth = computed(() => {
127
+ const prevMonth = activeMonthDate.value.getMonth() - 1;
128
+
129
+ return new Date(activeMonthDate.value.getFullYear(), prevMonth, 1);
130
+ });
131
+
132
+ const lastDayOfPrevMonth = computed(() => {
133
+ const date = new Date(activeMonthDate.value.valueOf());
134
+
135
+ date.setDate(0);
136
+
137
+ return date;
138
+ });
139
+
140
+ const firstDayOfNextMonth = computed(() => {
141
+ const date = new Date(activeMonthDate.value.valueOf());
142
+ const nextMonth = activeMonthDate.value.getMonth() + 1;
143
+
144
+ date.setDate(1);
145
+ date.setMonth(nextMonth);
146
+
147
+ return date;
148
+ });
149
+
150
+ const monthDays = computed(() => {
151
+ const dayNumber = lastDayOfMonth.value.getDate();
152
+
153
+ return Array.from({ length: dayNumber }, (_, index) => dayNumber - index)
154
+ .map((day) => getDay(activeMonthDate.value, day))
155
+ .reverse();
156
+ });
157
+
158
+ const prevMonthDays = computed(() => {
159
+ let prevMonthTotalDays = firstDayOfMonth.value.getDay() - START_WEEK;
160
+
161
+ if (prevMonthTotalDays < 0) {
162
+ prevMonthTotalDays = DAYS_IN_WEEK + prevMonthTotalDays;
163
+ }
164
+
165
+ return Array.from(
166
+ { length: prevMonthTotalDays },
167
+ (_, index) => lastDayOfPrevMonth.value.getDate() - index,
168
+ )
169
+ .map((day) => getDay(firstDayOfPrevMonth.value, day))
170
+ .reverse();
171
+ });
172
+
173
+ const nextMonthDays = computed(() => {
174
+ const nextMonthTotalDays =
175
+ DAYS_IN_WEEK - (monthDays.value.concat(prevMonthDays.value).length % DAYS_IN_WEEK);
176
+
177
+ if (nextMonthTotalDays === DAYS_IN_WEEK) {
178
+ return [];
179
+ }
180
+
181
+ return Array.from({ length: nextMonthTotalDays }, (_, index) => nextMonthTotalDays - index)
182
+ .map((day) => getDay(firstDayOfNextMonth.value, day))
183
+ .reverse();
184
+ });
185
+
186
+ const weekdays = computed(() =>
187
+ Array.from({ length: DAYS_IN_WEEK }, (_, index) => DAYS_IN_WEEK - index)
188
+ .map(getWeekDayName)
189
+ .reverse(),
190
+ );
191
+
192
+ const days = computed(() => {
193
+ return prevMonthDays.value.concat(monthDays.value, nextMonthDays.value);
194
+ });
195
+
196
+ function getWeekDayName(dayNumber) {
197
+ const date = new Date();
198
+
199
+ date.setDate((date.getDate() + (DAYS_IN_WEEK + dayNumber - date.getDay())) % DAYS_IN_WEEK);
200
+
201
+ return formatDate(date, "D", props.locale);
202
+ }
203
+
204
+ function getDay(date, dayNumber) {
205
+ const day = new Date(date.valueOf());
206
+
207
+ day.setDate(dayNumber);
208
+
209
+ return day;
210
+ }
211
+
212
+ function getDayClasses(day) {
213
+ if (isToday(day) && props.selectedDate === null) {
214
+ return [currentDayAttrs.value.class];
215
+ }
216
+
217
+ if (props.range && isSelectedDay(day)) {
218
+ return [inRangeFirstDayAttrs.value.class];
219
+ }
220
+
221
+ if (props.range && isSelectedToDay(day)) {
222
+ return [inRangeLastDayAttrs.value.class];
223
+ }
224
+
225
+ if (
226
+ props.range &&
227
+ localSelectedDate.value &&
228
+ props.selectedDateTo &&
229
+ !dateIsOutOfRange(day, props.selectedDate, props.selectedDateTo, props.locale, props.dateFormat)
230
+ ) {
231
+ return [inRangeDayAttrs.value.class];
232
+ }
233
+
234
+ if (isSelectedDay(day)) {
235
+ return [selectedDayAttrs.value.class];
236
+ }
237
+
238
+ if (isSameDay(props.activeDate, day)) {
239
+ return [activeDayAttrs.value.class];
240
+ }
241
+
242
+ if (isAnotherMothDay(day, activeMonthDate.value)) {
243
+ return [anotherMonthDayAttrs.value.class];
244
+ }
245
+ }
246
+
247
+ function isSelectedDay(day) {
248
+ return isSameDay(day, localSelectedDate.value);
249
+ }
250
+
251
+ function isSelectedToDay(day) {
252
+ return isSameDay(day, props.selectedDateTo);
253
+ }
254
+
255
+ function onClickDay(day) {
256
+ const isSameDay = isSelectedDay(day) && props.selectedDate !== null;
257
+ const isSameDayInRange =
258
+ isSelectedDay(day) && props.selectedDate !== null && props.selectedDateTo && props.range;
259
+
260
+ if (isSameDay || isSameDayInRange) {
261
+ emit("input", null);
262
+
263
+ return;
264
+ }
265
+
266
+ emit("input", day);
267
+ }
268
+ </script>
@@ -0,0 +1,114 @@
1
+ <template>
2
+ <div v-bind="monthViewWrapperAttrs">
3
+ <button
4
+ v-for="month in months"
5
+ :key="month"
6
+ :disabled="dateIsOutOfRange(month, minDate, maxDate, locale, dateFormat)"
7
+ v-bind="monthAttrs(getMonthClasses(month))"
8
+ @click="onClickMonth(month)"
9
+ @mousedown.prevent.capture
10
+ v-text="formatDate(month, 'M', props.locale)"
11
+ />
12
+ </div>
13
+ </template>
14
+
15
+ <script setup>
16
+ import { computed } from "vue";
17
+ import { formatDate, dateIsOutOfRange } from "../services/calendar.service";
18
+ import { isSameMonth, getDateWithoutTime } from "../services/date.service";
19
+
20
+ import useAttrs from "../composables/attrs.composable";
21
+
22
+ import { MONTHS_PER_VIEW } from "../constants";
23
+
24
+ const props = defineProps({
25
+ selectedDate: {
26
+ type: [Date, null],
27
+ required: true,
28
+ },
29
+
30
+ activeDate: {
31
+ type: [Date, null],
32
+ required: true,
33
+ },
34
+
35
+ activeMonth: {
36
+ type: [Date, null],
37
+ required: true,
38
+ },
39
+
40
+ locale: {
41
+ type: Object,
42
+ required: true,
43
+ },
44
+
45
+ dateFormat: {
46
+ type: String,
47
+ required: true,
48
+ },
49
+
50
+ maxDate: {
51
+ type: [Date, String],
52
+ default: undefined,
53
+ },
54
+
55
+ minDate: {
56
+ type: [Date, String],
57
+ default: undefined,
58
+ },
59
+
60
+ config: {
61
+ type: Object,
62
+ default: () => ({}),
63
+ },
64
+ });
65
+
66
+ const emit = defineEmits(["input"]);
67
+
68
+ const { monthViewWrapperAttrs, selectedMonthAttrs, activeMonthAttrs, monthAttrs } = useAttrs(props);
69
+
70
+ const localSelectedDate = computed(() => {
71
+ return props.selectedDate === null ? getDateWithoutTime() : props.selectedDate;
72
+ });
73
+
74
+ const localActiveMonth = computed(
75
+ () => props.activeMonth || props.activeDate || localSelectedDate.value,
76
+ );
77
+
78
+ const months = computed(() =>
79
+ Array.from({ length: MONTHS_PER_VIEW }, (_, i) => i).map((monthNumber) => getMonth(monthNumber)),
80
+ );
81
+
82
+ function getMonth(monthNumber) {
83
+ let newDate = new Date(localActiveMonth.value.valueOf());
84
+
85
+ newDate.setMonth(monthNumber);
86
+
87
+ // Means the current day has less days so the extra month is
88
+ // in the following month
89
+ if (newDate.getDate() !== localActiveMonth.value.getDate()) {
90
+ // Assign the last day of previous month
91
+ newDate = new Date(newDate.getFullYear(), newDate.getMonth(), 0);
92
+ }
93
+
94
+ return newDate;
95
+ }
96
+
97
+ function getMonthClasses(day) {
98
+ if (isSelectedMonth(day)) {
99
+ return [selectedMonthAttrs.value.class];
100
+ }
101
+
102
+ if (isSameMonth(props.activeMonth, day)) {
103
+ return [activeMonthAttrs.value.class];
104
+ }
105
+ }
106
+
107
+ function isSelectedMonth(month) {
108
+ return isSameMonth(month, localSelectedDate.value);
109
+ }
110
+
111
+ function onClickMonth(month) {
112
+ emit("input", month);
113
+ }
114
+ </script>