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,263 @@
1
+ <template>
2
+ <UInput
3
+ :id="id"
4
+ ref="moneyInputRef"
5
+ v-model="formattedValue"
6
+ :size="size"
7
+ :label="localLabel"
8
+ :label-outside="labelOutside"
9
+ :placeholder="placeholder"
10
+ :description="description"
11
+ :error="error"
12
+ :disabled="disabled"
13
+ inputmode="decimal"
14
+ :data-cy="`${dataCy}-base-currency`"
15
+ v-bind="inputAttrs"
16
+ @keyup="onKeyup"
17
+ @blur="onBlur"
18
+ @input="onInput"
19
+ >
20
+ <template #left>
21
+ <!-- @slot Use it to add something left. -->
22
+ <slot name="left" />
23
+ </template>
24
+
25
+ <template #right>
26
+ <!-- @slot Use it to add something right. -->
27
+ <slot name="right" />
28
+ </template>
29
+
30
+ <template #right-icon>
31
+ <!-- @slot Use it to add right icon. -->
32
+ <slot name="right-icon" />
33
+ </template>
34
+ </UInput>
35
+ </template>
36
+
37
+ <script setup>
38
+ import { computed, ref, watch, onMounted, nextTick } from "vue";
39
+
40
+ import UIService, { getRandomId } from "../service.ui";
41
+
42
+ import UInput from "../ui.form-input";
43
+ import { SYMBOL_MINUS } from "../ui.text-money/constants";
44
+
45
+ import defaultConfig from "./configs/default.config";
46
+ import useAttrs from "./composables/attrs.composable";
47
+ import useFormatCurrency from "./composables/useFormatCurrency";
48
+ import { UInputMoney } from "./constants";
49
+
50
+ /* Should be a string for correct web-types gen */
51
+ defineOptions({ name: "UInputMoney", inheritAttrs: false });
52
+
53
+ const props = defineProps({
54
+ /**
55
+ * Input value.
56
+ */
57
+ modelValue: {
58
+ type: [String, Number],
59
+ default: "",
60
+ },
61
+ /**
62
+ * Input label.
63
+ */
64
+ label: {
65
+ type: String,
66
+ default: "",
67
+ },
68
+
69
+ /**
70
+ * Show label outside the input block.
71
+ */
72
+ labelOutside: {
73
+ type: Boolean,
74
+ default: UIService.get(defaultConfig, UInputMoney).default.labelOutside,
75
+ },
76
+
77
+ /**
78
+ * Currency symbol.
79
+ */
80
+ symbol: {
81
+ type: String,
82
+ default: UIService.get(defaultConfig, UInputMoney).default.symbol,
83
+ },
84
+
85
+ /**
86
+ * Input placeholder.
87
+ */
88
+ placeholder: {
89
+ type: String,
90
+ default: "",
91
+ },
92
+
93
+ /**
94
+ * Input description.
95
+ */
96
+ description: {
97
+ type: String,
98
+ default: "",
99
+ },
100
+
101
+ /**
102
+ * Error message.
103
+ */
104
+ error: {
105
+ type: String,
106
+ default: "",
107
+ },
108
+
109
+ /**
110
+ * Input size.
111
+ * @values sm, md, lg
112
+ */
113
+ size: {
114
+ type: String,
115
+ default: UIService.get(defaultConfig, UInputMoney).default.size,
116
+ },
117
+
118
+ /**
119
+ * Number of signs after the comma.
120
+ */
121
+ decimalScale: {
122
+ type: Number,
123
+ default: UIService.get(defaultConfig, UInputMoney).default.decimalScale,
124
+ },
125
+
126
+ /**
127
+ * A symbol used to separate the integer part from the fractional part of a number.
128
+ */
129
+ decimalSeparator: {
130
+ type: String,
131
+ default: UIService.get(defaultConfig, UInputMoney).default.decimalSeparator,
132
+ },
133
+
134
+ /**
135
+ * A symbol used to separate the thousand parts of a number.
136
+ */
137
+ thousandsSeparator: {
138
+ type: String,
139
+ default: UIService.get(defaultConfig, UInputMoney).default.thousandsSeparator,
140
+ },
141
+
142
+ /**
143
+ * Allow only positive values.
144
+ */
145
+ positiveOnly: {
146
+ type: Boolean,
147
+ default: UIService.get(defaultConfig, UInputMoney).default.positiveOnly,
148
+ },
149
+
150
+ /**
151
+ * Show prefix in the raw value number.
152
+ */
153
+ rawValuePrefix: {
154
+ type: Boolean,
155
+ default: UIService.get(defaultConfig, UInputMoney).default.rawValuePrefix,
156
+ },
157
+
158
+ /**
159
+ * Show minus sign.
160
+ */
161
+ minus: {
162
+ type: Boolean,
163
+ default: UIService.get(defaultConfig, UInputMoney).default.minus,
164
+ },
165
+
166
+ /**
167
+ * Set input read-only.
168
+ */
169
+ readonly: {
170
+ type: Boolean,
171
+ default: UIService.get(defaultConfig, UInputMoney).default.readonly,
172
+ },
173
+
174
+ /**
175
+ * Disable the input.
176
+ */
177
+ disabled: {
178
+ type: Boolean,
179
+ default: UIService.get(defaultConfig, UInputMoney).default.disabled,
180
+ },
181
+
182
+ /**
183
+ * Unique element id.
184
+ * @ignore
185
+ */
186
+ id: {
187
+ type: String,
188
+ default: () => getRandomId(),
189
+ },
190
+
191
+ /**
192
+ * Component ui config object.
193
+ */
194
+ config: {
195
+ type: Object,
196
+ default: () => ({}),
197
+ },
198
+
199
+ /**
200
+ * Data-cy attribute for automated testing.
201
+ */
202
+ dataCy: {
203
+ type: String,
204
+ default: "",
205
+ },
206
+ });
207
+
208
+ const emit = defineEmits(["update:modelValue", "keyup", "blur", "input"]);
209
+
210
+ const moneyInputRef = ref(null);
211
+
212
+ const { inputAttrs } = useAttrs(props);
213
+
214
+ const { formattedValue, rawValue, setValue } = useFormatCurrency(`#${props.id}`, () => ({
215
+ decimalScale: props.decimalScale,
216
+ decimalSeparator: props.decimalSeparator,
217
+ thousandsSeparator: props.thousandsSeparator,
218
+ positiveOnly: props.positiveOnly,
219
+ rawValuePrefix: props.rawValuePrefix,
220
+ prefix: props.minus ? SYMBOL_MINUS : "",
221
+ }));
222
+
223
+ const localValue = computed({
224
+ get: () => props.modelValue,
225
+ set: (value) => emit("update:modelValue", value),
226
+ });
227
+
228
+ const localLabel = computed(() => {
229
+ const comma = props.symbol && props.label ? "," : "";
230
+ const symbol = props.label ? props.symbol : "";
231
+
232
+ return `${props.label}${comma} ${symbol}`.trim();
233
+ });
234
+
235
+ const input = computed(() => {
236
+ return moneyInputRef.value.input;
237
+ });
238
+
239
+ watch(
240
+ () => props.modelValue,
241
+ () => String(localValue.value) !== String(rawValue.value) && setValue(localValue.value),
242
+ );
243
+
244
+ defineExpose({ input, rawValue, formattedValue });
245
+
246
+ onMounted(() => {
247
+ setValue(localValue.value);
248
+ });
249
+
250
+ function onKeyup(event) {
251
+ localValue.value = rawValue.value || "";
252
+
253
+ nextTick(() => emit("keyup", event));
254
+ }
255
+
256
+ function onBlur() {
257
+ nextTick(() => emit("blur"));
258
+ }
259
+
260
+ function onInput(value) {
261
+ nextTick(() => emit("input", value));
262
+ }
263
+ </script>
@@ -0,0 +1,72 @@
1
+ export default class FormatService {
2
+ static isNumberValueRegExp = /^[\d,.\s-]+$/;
3
+ static rawDecimalMark = ".";
4
+ static comma = ",";
5
+
6
+ static getRawValue(value, options) {
7
+ const { thousandsSeparator, decimalSeparator, rawValuePrefix, prefix } = options;
8
+
9
+ value = String(value).endsWith(decimalSeparator)
10
+ ? String(value).replace(decimalSeparator, "")
11
+ : String(value);
12
+
13
+ const rawValueWithPrefix = value
14
+ .replaceAll(thousandsSeparator, "")
15
+ .replace(decimalSeparator, ".");
16
+
17
+ return rawValuePrefix ? rawValueWithPrefix : rawValueWithPrefix.replace(prefix, "");
18
+ }
19
+
20
+ static getFormattedValue(value, options) {
21
+ const { thousandsSeparator, decimalSeparator, decimalScale, prefix, positiveOnly } = options;
22
+
23
+ const invalidValuesRegExp = new RegExp("[^\\d,\\d.\\s-" + decimalSeparator + "]", "g");
24
+ const doubleValueRegExp = new RegExp("([,\\.\\s-" + decimalSeparator + "])+", "g");
25
+
26
+ // slice to first decimal mark
27
+ value = String(value)
28
+ .replaceAll(this.comma, decimalSeparator)
29
+ .split(decimalSeparator)
30
+ .slice(0, 2)
31
+ .map((value, index) => (index ? value.replaceAll(thousandsSeparator, "") : value))
32
+ .join(decimalSeparator);
33
+
34
+ value = String(value)
35
+ .replace(invalidValuesRegExp, "")
36
+ .replace(doubleValueRegExp, "$1")
37
+ .replaceAll(decimalSeparator, this.rawDecimalMark);
38
+
39
+ const isNumber = this.isNumberValueRegExp.test(value);
40
+ const isFloat = value.endsWith(this.rawDecimalMark) || value.endsWith(".0");
41
+
42
+ if (!value || !isNumber || isFloat) {
43
+ return `${prefix}${value.replaceAll(this.rawDecimalMark, decimalSeparator)}`;
44
+ }
45
+
46
+ const intlNumber = new Intl.NumberFormat("en-US", {
47
+ minimumFractionDigits: 0,
48
+ maximumFractionDigits: decimalScale,
49
+ signDisplay: positiveOnly ? "never" : "negative",
50
+ roundingMode: "floor",
51
+ });
52
+
53
+ const rawValue = this.getRawValue(value, {
54
+ decimalSeparator,
55
+ thousandsSeparator,
56
+ prefix,
57
+ rawValuePrefix: false,
58
+ });
59
+
60
+ const formattedValue = intlNumber.formatToParts(parseFloat(rawValue) || 0).map((part) => {
61
+ if (part.type === "group") part.value = thousandsSeparator;
62
+ if (part.type === "decimal") part.value = decimalSeparator;
63
+ if (part.type === "fraction") part.value = part.value.padEnd(decimalScale, "0");
64
+
65
+ return part;
66
+ });
67
+
68
+ formattedValue.unshift({ value: prefix, type: "minusSign" });
69
+
70
+ return formattedValue.map((part) => part.value).join("");
71
+ }
72
+ }
@@ -0,0 +1,16 @@
1
+ import { Meta, Title, Subtitle, Description, Primary, Controls, Stories, Source } 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 />
@@ -0,0 +1,47 @@
1
+ import useUI from "../../composable.ui";
2
+ import { cva } from "../../service.ui";
3
+
4
+ import defaultConfig from "../configs/default.config";
5
+ import { computed } from "vue";
6
+
7
+ export function useAttrs(props) {
8
+ const { config, getAttrs } = useUI(defaultConfig, () => props.config);
9
+ const { value, text } = config.value;
10
+
11
+ const cvaValue = cva({
12
+ base: value.base,
13
+ variants: value.variants,
14
+ compoundVariants: value.compoundVariants,
15
+ });
16
+
17
+ const cvaText = cva({
18
+ base: text.base,
19
+ variants: text.variants,
20
+ compoundVariants: text.compoundVariants,
21
+ });
22
+
23
+ const textClasses = computed(() => cvaText({ size: props.size }));
24
+
25
+ const valueClasses = computed(() => cvaValue({ size: props.size }));
26
+
27
+ const wrapperAttrs = getAttrs("wrapper");
28
+ const numberAttrs = getAttrs("number");
29
+ const removeButtonAttrs = getAttrs("removeButton", { isComponent: true });
30
+ const removeIconAttrs = getAttrs("removeIcon", { isComponent: true });
31
+ const addButtonAttrs = getAttrs("addButton", { isComponent: true });
32
+ const addIconAttrs = getAttrs("addIcon", { isComponent: true });
33
+ const valueAttrs = getAttrs("value", { classes: valueClasses });
34
+ const textAttrs = getAttrs("text", { classes: textClasses });
35
+
36
+ return {
37
+ config,
38
+ valueAttrs,
39
+ textAttrs,
40
+ removeButtonAttrs,
41
+ removeIconAttrs,
42
+ addButtonAttrs,
43
+ addIconAttrs,
44
+ wrapperAttrs,
45
+ numberAttrs,
46
+ };
47
+ }
@@ -0,0 +1,33 @@
1
+ export default /*tw*/ {
2
+ wrapper: "flex items-center space-x-6",
3
+ number: "flex items-center flex-col",
4
+ removeButton: "",
5
+ removeIcon: "",
6
+ removeIconName: "remove",
7
+ addButton: "",
8
+ addIcon: "",
9
+ addIconName: "add",
10
+ value: {
11
+ base: "font-bold select-none !leading-none",
12
+ variants: {
13
+ size: {
14
+ sm: "text-sm",
15
+ md: "text-base",
16
+ lg: "text-lg",
17
+ },
18
+ },
19
+ },
20
+ text: {
21
+ base: "pt-1 !leading-none text-gray-500",
22
+ variants: {
23
+ size: {
24
+ sm: "text-xs",
25
+ md: "text-sm",
26
+ lg: "text-base",
27
+ },
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ size: "md",
32
+ },
33
+ };
@@ -0,0 +1,5 @@
1
+ /*
2
+ This const is needed to prevent the issue in script setup:
3
+ `defineProps` is referencing locally declared variables. (vue/valid-define-props)
4
+ */
5
+ export const UInputNumber = "UInputNumber";
@@ -0,0 +1,103 @@
1
+ import { getArgTypes } from "../service.storybook";
2
+
3
+ import UInputNumber from "../ui.form-input-number";
4
+ import UGroup from "../ui.container-group";
5
+
6
+ export default {
7
+ id: "3050",
8
+ title: "Form Inputs & Controls / Input Number",
9
+ component: UInputNumber,
10
+ argTypes: {
11
+ ...getArgTypes(UInputNumber.name),
12
+ value: 1,
13
+ },
14
+ };
15
+
16
+ const DefaultTemplate = (args) => ({
17
+ components: { UInputNumber },
18
+ setup() {
19
+ return { args };
20
+ },
21
+ data() {
22
+ return {
23
+ count: 1,
24
+ };
25
+ },
26
+ template: `
27
+ <UInputNumber v-model="count" v-bind="args" />
28
+ `,
29
+ });
30
+
31
+ const SizesTemplate = (args, { argTypes } = {}) => ({
32
+ components: { UInputNumber, UGroup },
33
+ setup() {
34
+ return {
35
+ args,
36
+ sizes: argTypes.size.options,
37
+ };
38
+ },
39
+ data() {
40
+ return {
41
+ sizeValues: [
42
+ { count: 1, label: "sm" },
43
+ { count: 1, label: "md" },
44
+ { count: 1, label: "lg" },
45
+ ],
46
+ };
47
+ },
48
+ template: `
49
+ <UGroup size="lg">
50
+ <UInputNumber
51
+ v-for="(size, index) in sizes"
52
+ v-bind="args"
53
+ :size="size"
54
+ :key="index"
55
+ :label="sizeValues[index].label"
56
+ v-model="sizeValues[index].count"
57
+ />
58
+ </UGroup>
59
+ `,
60
+ });
61
+
62
+ export const Default = DefaultTemplate.bind({});
63
+ Default.args = {
64
+ value: 1,
65
+ step: 1,
66
+ min: 1,
67
+ max: 100,
68
+ };
69
+
70
+ export const label = DefaultTemplate.bind({});
71
+ label.args = {
72
+ value: 1,
73
+ step: 1,
74
+ min: 1,
75
+ max: 100,
76
+ label: "Year",
77
+ };
78
+
79
+ export const sizes = SizesTemplate.bind({});
80
+ sizes.args = {
81
+ value: 1,
82
+ step: 1,
83
+ min: 1,
84
+ max: 100,
85
+ };
86
+
87
+ export const valueLimit = DefaultTemplate.bind({});
88
+ valueLimit.args = {
89
+ value: 1,
90
+ step: 1,
91
+ min: 5,
92
+ max: 10,
93
+ label: "Min is 5 | Max is 10",
94
+ };
95
+
96
+ export const step = DefaultTemplate.bind({});
97
+ step.args = {
98
+ value: 1,
99
+ step: 5,
100
+ min: 1,
101
+ max: 100,
102
+ label: "Step is 5",
103
+ };
@@ -0,0 +1,162 @@
1
+ <template>
2
+ <div :data-cy="dataCy" v-bind="wrapperAttrs">
3
+ <UButton
4
+ variant="thirdary"
5
+ size="sm"
6
+ filled
7
+ square
8
+ pill
9
+ :disabled="isRemoveButtonDisabled"
10
+ v-bind="removeButtonAttrs"
11
+ @click="onClickRemove"
12
+ >
13
+ <UIcon
14
+ :name="config.removeIconName"
15
+ :size="size"
16
+ :color="isRemoveButtonDisabled ? 'gray' : 'grayscale'"
17
+ :data-cy="`${dataCy}-remove`"
18
+ v-bind="removeIconAttrs"
19
+ />
20
+ </UButton>
21
+
22
+ <div v-bind="numberAttrs">
23
+ <div v-bind="valueAttrs" v-text="count" />
24
+ <div v-bind="textAttrs" v-text="label" />
25
+ </div>
26
+
27
+ <UButton
28
+ variant="thirdary"
29
+ size="sm"
30
+ filled
31
+ square
32
+ pill
33
+ :disabled="isAddButtonDisabled"
34
+ v-bind="addButtonAttrs"
35
+ @click="onClickAdd"
36
+ >
37
+ <UIcon
38
+ :name="config.addIconName"
39
+ :size="size"
40
+ :color="isAddButtonDisabled ? 'gray' : 'grayscale'"
41
+ :data-cy="`${dataCy}-add`"
42
+ v-bind="addIconAttrs"
43
+ />
44
+ </UButton>
45
+ </div>
46
+ </template>
47
+
48
+ <script setup>
49
+ import { computed } from "vue";
50
+
51
+ import UIcon from "../ui.image-icon";
52
+ import UButton from "../ui.button";
53
+ import UIService from "../service.ui";
54
+
55
+ import defaultConfig from "./configs/default.config";
56
+ import { UInputNumber } from "./constants";
57
+ import { useAttrs } from "./composables/attrs.composable";
58
+
59
+ /* Should be a string for correct web-types gen */
60
+ defineOptions({ name: "UInputNumber", inheritAttrs: false });
61
+
62
+ const props = defineProps({
63
+ /**
64
+ * Input value.
65
+ */
66
+ modelValue: {
67
+ type: Number,
68
+ required: true,
69
+ },
70
+
71
+ /**
72
+ * Input step.
73
+ */
74
+ step: {
75
+ type: Number,
76
+ default: 1,
77
+ },
78
+
79
+ /**
80
+ * Input min value.
81
+ */
82
+ min: {
83
+ type: Number,
84
+ default: 1,
85
+ },
86
+
87
+ /**
88
+ * Input max value.
89
+ */
90
+ max: {
91
+ type: Number,
92
+ default: 999,
93
+ },
94
+
95
+ /**
96
+ * Input label below number.
97
+ */
98
+ label: {
99
+ type: String,
100
+ default: "",
101
+ },
102
+
103
+ /**
104
+ * Input size.
105
+ * @values sm, md, lg
106
+ */
107
+ size: {
108
+ type: String,
109
+ default: UIService.get(defaultConfig, UInputNumber).default.size,
110
+ },
111
+
112
+ /**
113
+ * Component ui config object.
114
+ */
115
+ config: {
116
+ type: Object,
117
+ default: () => ({}),
118
+ },
119
+
120
+ /**
121
+ * Data-cy attribute for automated testing.
122
+ */
123
+ dataCy: {
124
+ type: String,
125
+ default: "",
126
+ },
127
+ });
128
+
129
+ const emit = defineEmits(["update:modelValue"]);
130
+
131
+ const {
132
+ config,
133
+ valueAttrs,
134
+ textAttrs,
135
+ removeButtonAttrs,
136
+ removeIconAttrs,
137
+ addButtonAttrs,
138
+ addIconAttrs,
139
+ wrapperAttrs,
140
+ numberAttrs,
141
+ } = useAttrs(props);
142
+
143
+ const count = computed({
144
+ get: () => props.modelValue,
145
+ set: (value) => emit("update:modelValue", value),
146
+ });
147
+
148
+ const isAddButtonDisabled = computed(() => count.value >= props.max);
149
+ const isRemoveButtonDisabled = computed(() => count.value <= props.min);
150
+
151
+ function onClickRemove() {
152
+ const newCount = count.value - props.step;
153
+
154
+ count.value = newCount >= props.min ? newCount : count.value;
155
+ }
156
+
157
+ function onClickAdd() {
158
+ const newCount = count.value + props.step;
159
+
160
+ count.value = newCount <= props.max ? newCount : count.value;
161
+ }
162
+ </script>