vueless 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/package.json +1 -1
  2. package/src/library.web-types-gen/index.js +17 -0
  3. package/src/library.web-types-gen/lib/build.js +252 -0
  4. package/src/library.web-types-gen/lib/config.js +32 -0
  5. package/src/library.web-types-gen/package.json +3 -0
  6. package/src/plugin.vite/index.js +59 -0
  7. package/src/plugin.vite/services/iconResolver.service.js +291 -0
  8. package/src/plugin.vite/services/svgLoader.service.js +76 -0
  9. package/src/plugin.vite/services/tailwindSafelist.service.js +195 -0
  10. package/src/plugin.vite/services/unpluginComponentsResolver.js +172 -0
  11. package/src/service.storybook/index.js +91 -0
  12. package/src/ui.button/Docs.mdx +16 -0
  13. package/src/ui.button/composables/attrs.composable.js +41 -0
  14. package/src/ui.button/configs/default.config.js +165 -0
  15. package/src/ui.button/constants/index.js +5 -0
  16. package/src/ui.button/index.stories.js +166 -0
  17. package/src/ui.button/index.vue +152 -0
  18. package/src/ui.button-link/Docs.mdx +16 -0
  19. package/src/ui.button-link/composables/attrs.composable.js +99 -0
  20. package/src/ui.button-link/configs/default.config.js +80 -0
  21. package/src/ui.button-link/constants/index.js +5 -0
  22. package/src/ui.button-link/index.stories.js +158 -0
  23. package/src/ui.button-link/index.vue +226 -0
  24. package/src/ui.button-toggle/Docs.mdx +16 -0
  25. package/src/ui.button-toggle/composables/attrs.composable.js +16 -0
  26. package/src/ui.button-toggle/configs/default.config.js +12 -0
  27. package/src/ui.button-toggle/constants/index.js +7 -0
  28. package/src/ui.button-toggle/index.stories.js +155 -0
  29. package/src/ui.button-toggle/index.vue +128 -0
  30. package/src/ui.button-toggle-item/Docs.mdx +16 -0
  31. package/src/ui.button-toggle-item/composables/attrs.composable.js +53 -0
  32. package/src/ui.button-toggle-item/configs/default.config.js +58 -0
  33. package/src/ui.button-toggle-item/constants/index.js +5 -0
  34. package/src/ui.button-toggle-item/index.stories.js +77 -0
  35. package/src/ui.button-toggle-item/index.vue +147 -0
  36. package/src/ui.container-accordion/composables/attrs.composable.js +45 -0
  37. package/src/ui.container-accordion/configs/default.config.js +32 -0
  38. package/src/ui.container-accordion/constants/index.js +5 -0
  39. package/src/ui.container-accordion/index.stories.js +89 -0
  40. package/src/ui.container-accordion/index.vue +95 -0
  41. package/src/ui.container-card/Docs.mdx +16 -0
  42. package/src/ui.container-card/composable/attrs.composable.js +56 -0
  43. package/src/ui.container-card/configs/default.config.js +31 -0
  44. package/src/ui.container-card/constants/index.js +5 -0
  45. package/src/ui.container-card/index.stories.js +170 -0
  46. package/src/ui.container-card/index.vue +146 -0
  47. package/src/ui.container-divider/Docs.mdx +16 -0
  48. package/src/ui.container-divider/configs/default.config.js +79 -0
  49. package/src/ui.container-divider/index.stories.js +124 -0
  50. package/src/ui.container-group/Docs.mdx +16 -0
  51. package/src/ui.container-group/composables/attrs.composable.js +44 -0
  52. package/src/ui.container-group/configs/default.config.js +29 -0
  53. package/src/ui.container-group/constants/index.js +5 -0
  54. package/src/ui.container-group/index.stories.js +88 -0
  55. package/src/ui.container-group/index.vue +106 -0
  56. package/src/ui.container-groups/Docs.mdx +16 -0
  57. package/src/ui.container-groups/composables/attrs.composable.js +12 -0
  58. package/src/ui.container-groups/configs/default.config.js +3 -0
  59. package/src/ui.container-groups/index.stories.js +45 -0
  60. package/src/ui.container-groups/index.vue +33 -0
  61. package/src/ui.container-modal/Docs.mdx +16 -0
  62. package/src/ui.container-modal/composables/attrs.composable.js +90 -0
  63. package/src/ui.container-modal/configs/default.config.js +69 -0
  64. package/src/ui.container-modal/constants/index.js +5 -0
  65. package/src/ui.container-modal/index.stories.js +170 -0
  66. package/src/ui.container-modal/index.vue +335 -0
  67. package/src/ui.container-modal-confirm/Docs.mdx +16 -0
  68. package/src/ui.container-modal-confirm/composable/attrs.composable.js +20 -0
  69. package/src/ui.container-modal-confirm/configs/default.config.js +15 -0
  70. package/src/ui.container-modal-confirm/constants/index.js +5 -0
  71. package/src/ui.container-modal-confirm/index.stories.js +209 -0
  72. package/src/ui.container-modal-confirm/index.vue +182 -0
  73. package/src/ui.container-page/Docs.mdx +16 -0
  74. package/src/ui.container-page/composables/attrs.composable.js +96 -0
  75. package/src/ui.container-page/configs/default.config.js +71 -0
  76. package/src/ui.container-page/constants/index.js +5 -0
  77. package/src/ui.container-page/index.stories.js +147 -0
  78. package/src/ui.container-page/index.vue +271 -0
  79. package/src/ui.container-row/Docs.mdx +16 -0
  80. package/src/ui.container-row/composables/attrs.composable.js +23 -0
  81. package/src/ui.container-row/configs/default.config.js +14 -0
  82. package/src/ui.container-row/constants/index.js +5 -0
  83. package/src/ui.container-row/index.stories.js +81 -0
  84. package/src/ui.container-row/index.vue +45 -0
  85. package/src/ui.data-list/composables/attrs.composable.js +45 -0
  86. package/src/ui.data-list/configs/default.config.js +32 -0
  87. package/src/ui.data-list/constants/index.js +5 -0
  88. package/src/ui.data-list/index.stories.js +91 -0
  89. package/src/ui.data-list/index.vue +258 -0
  90. package/src/ui.data-table/Docs.mdx +16 -0
  91. package/src/ui.data-table-cell/configs/default.config.js +19 -0
  92. package/src/ui.dropdown-badge/Docs.mdx +16 -0
  93. package/src/ui.dropdown-badge/composables/attrs.composable.js +63 -0
  94. package/src/ui.dropdown-badge/configs/default.config.js +34 -0
  95. package/src/ui.dropdown-badge/constants/index.js +5 -0
  96. package/src/ui.dropdown-badge/index.stories.js +126 -0
  97. package/src/ui.dropdown-badge/index.vue +233 -0
  98. package/src/ui.dropdown-button/Docs.mdx +16 -0
  99. package/src/ui.dropdown-button/composables/attrs.composable.js +63 -0
  100. package/src/ui.dropdown-button/configs/default.config.js +37 -0
  101. package/src/ui.dropdown-button/constants/index.js +14 -0
  102. package/src/ui.dropdown-button/index.stories.js +158 -0
  103. package/src/ui.dropdown-button/index.vue +271 -0
  104. package/src/ui.dropdown-item/Docs.mdx +16 -0
  105. package/src/ui.dropdown-item/composables/attrs.composable.js +13 -0
  106. package/src/ui.dropdown-item/configs/default.config.js +16 -0
  107. package/src/ui.dropdown-item/index.stories.js +30 -0
  108. package/src/ui.dropdown-item/index.vue +53 -0
  109. package/src/ui.dropdown-link/Docs.mdx +16 -0
  110. package/src/ui.dropdown-link/composables/attrs.composable.js +65 -0
  111. package/src/ui.dropdown-link/configs/default.config.js +37 -0
  112. package/src/ui.dropdown-link/constants/index.js +5 -0
  113. package/src/ui.dropdown-link/index.stories.js +127 -0
  114. package/src/ui.dropdown-link/index.vue +260 -0
  115. package/src/ui.dropdown-list/Docs.mdx +16 -0
  116. package/src/ui.dropdown-list/composables/attrs.composable.js +93 -0
  117. package/src/ui.dropdown-list/composables/usePointer.js +77 -0
  118. package/src/ui.dropdown-list/configs/default.config.js +74 -0
  119. package/src/ui.dropdown-list/constants/index.js +5 -0
  120. package/src/ui.dropdown-list/index.stories.js +76 -0
  121. package/src/ui.dropdown-list/index.vue +282 -0
  122. package/src/ui.form-calendar/Docs.mdx +52 -0
  123. package/src/ui.form-calendar/components/DayView.vue +268 -0
  124. package/src/ui.form-calendar/components/MonthView.vue +114 -0
  125. package/src/ui.form-calendar/components/YearView.vue +118 -0
  126. package/src/ui.form-calendar/constants/index.js +71 -0
  127. package/src/ui.form-calendar/index.stories.js +59 -0
  128. package/src/ui.form-calendar/index.vue +738 -0
  129. package/src/ui.form-calendar/services/calendar.service.js +189 -0
  130. package/src/ui.form-calendar/services/formatting.service.js +180 -0
  131. package/src/ui.form-checkbox/Docs.mdx +16 -0
  132. package/src/ui.form-checkbox/configs/default.config.js +69 -0
  133. package/src/ui.form-checkbox/index.stories.js +147 -0
  134. package/src/ui.form-checkbox-group/Docs.mdx +16 -0
  135. package/src/ui.form-checkbox-group/composables/attrs.composable.js +17 -0
  136. package/src/ui.form-checkbox-group/configs/default.config.js +5 -0
  137. package/src/ui.form-checkbox-group/constants/index.js +5 -0
  138. package/src/ui.form-checkbox-group/index.stories.js +45 -0
  139. package/src/ui.form-checkbox-group/index.vue +143 -0
  140. package/src/ui.form-checkbox-multi-state/Docs.mdx +16 -0
  141. package/src/ui.form-checkbox-multi-state/composables/attrs.composable.js +24 -0
  142. package/src/ui.form-checkbox-multi-state/configs/default.config.js +9 -0
  143. package/src/ui.form-checkbox-multi-state/constants/index.js +5 -0
  144. package/src/ui.form-checkbox-multi-state/index.stories.js +59 -0
  145. package/src/ui.form-checkbox-multi-state/index.vue +133 -0
  146. package/src/ui.form-color-picker/composables/attrs.composable.js +44 -0
  147. package/src/ui.form-color-picker/configs/default.config.js +52 -0
  148. package/src/ui.form-color-picker/constants/index.js +5 -0
  149. package/src/ui.form-color-picker/index.stories.js +63 -0
  150. package/src/ui.form-color-picker/index.vue +168 -0
  151. package/src/ui.form-date-picker/Docs.mdx +52 -0
  152. package/src/ui.form-date-picker/composables/attrs.composable.js +22 -0
  153. package/src/ui.form-date-picker/configs/default.config.js +26 -0
  154. package/src/ui.form-date-picker/constants/index.js +5 -0
  155. package/src/ui.form-date-picker/index.stories.js +132 -0
  156. package/src/ui.form-date-picker/index.vue +253 -0
  157. package/src/ui.form-date-picker-range/constants/index.js +23 -0
  158. package/src/ui.form-date-picker-range/index.stories.js +135 -0
  159. package/src/ui.form-date-picker-range/index.vue +929 -0
  160. package/src/ui.form-date-picker-range/services/dateRange.service.js +116 -0
  161. package/src/ui.form-input/Docs.mdx +16 -0
  162. package/src/ui.form-input/assets/fonts/text-security-disc.woff +0 -0
  163. package/src/ui.form-input/composables/attrs.composable.js +66 -0
  164. package/src/ui.form-input/configs/default.config.js +72 -0
  165. package/src/ui.form-input/constants/index.js +5 -0
  166. package/src/ui.form-input/index.stories.js +166 -0
  167. package/src/ui.form-input/index.vue +385 -0
  168. package/src/ui.form-input-file/composables/attrs.composable.js +82 -0
  169. package/src/ui.form-input-file/configs/default.config.js +59 -0
  170. package/src/ui.form-input-file/constants/index.js +5 -0
  171. package/src/ui.form-input-file/index.stories.js +86 -0
  172. package/src/ui.form-input-file/index.vue +385 -0
  173. package/src/ui.form-input-money/Docs.mdx +16 -0
  174. package/src/ui.form-input-money/composables/attrs.composable.js +13 -0
  175. package/src/ui.form-input-money/composables/useFormatCurrency.js +82 -0
  176. package/src/ui.form-input-money/configs/default.config.js +16 -0
  177. package/src/ui.form-input-money/constants/index.js +5 -0
  178. package/src/ui.form-input-money/index.stories.js +126 -0
  179. package/src/ui.form-input-money/index.vue +264 -0
  180. package/src/ui.form-input-money/services/format.service.js +72 -0
  181. package/src/ui.form-input-number/Docs.mdx +16 -0
  182. package/src/ui.form-input-number/composables/attrs.composable.js +47 -0
  183. package/src/ui.form-input-number/configs/default.config.js +33 -0
  184. package/src/ui.form-input-number/constants/index.js +5 -0
  185. package/src/ui.form-input-number/index.stories.js +103 -0
  186. package/src/ui.form-input-number/index.vue +159 -0
  187. package/src/ui.form-input-rating/composables/attrs.composable.js +34 -0
  188. package/src/ui.form-input-rating/constants/index.js +5 -0
  189. package/src/ui.form-input-search/composables/attrs.composable.js +21 -0
  190. package/src/ui.form-input-search/configs/default.config.js +20 -0
  191. package/src/ui.form-input-search/constants/index.js +5 -0
  192. package/src/ui.form-input-search/index.stories.js +90 -0
  193. package/src/ui.form-input-search/index.vue +212 -0
  194. package/src/ui.form-label/Docs.mdx +16 -0
  195. package/src/ui.form-label/composables/attrs.composable.js +65 -0
  196. package/src/ui.form-label/configs/default.config.js +95 -0
  197. package/src/ui.form-label/constants/index.js +13 -0
  198. package/src/ui.form-label/index.stories.js +107 -0
  199. package/src/ui.form-label/index.vue +170 -0
  200. package/src/ui.form-radio/Docs.mdx +16 -0
  201. package/src/ui.form-radio/composables/attrs.composable.js +34 -0
  202. package/src/ui.form-radio/configs/default.config.js +47 -0
  203. package/src/ui.form-radio/constants/index.js +5 -0
  204. package/src/ui.form-radio/index.stories.js +71 -0
  205. package/src/ui.form-radio/index.vue +169 -0
  206. package/src/ui.form-radio-card/Docs.mdx +16 -0
  207. package/src/ui.form-radio-card/constants/index.js +5 -0
  208. package/src/ui.form-radio-card/index.stories.js +149 -0
  209. package/src/ui.form-radio-card/services/variant.service.js +15 -0
  210. package/src/ui.form-radio-group/Docs.mdx +16 -0
  211. package/src/ui.form-radio-group/composables/attrs.composable.js +27 -0
  212. package/src/ui.form-radio-group/configs/default.config.js +18 -0
  213. package/src/ui.form-radio-group/constants/index.js +5 -0
  214. package/src/ui.form-radio-group/index.stories.js +42 -0
  215. package/src/ui.form-radio-group/index.vue +127 -0
  216. package/src/ui.form-select/Docs.mdx +16 -0
  217. package/src/ui.form-select/composables/attrs.composable.js +172 -0
  218. package/src/ui.form-select/configs/default.config.js +138 -0
  219. package/src/ui.form-select/constants/index.js +19 -0
  220. package/src/ui.form-select/index.stories.js +339 -0
  221. package/src/ui.form-select/index.vue +719 -0
  222. package/src/ui.form-select/services/select.service.js +98 -0
  223. package/src/ui.form-switch/composables/attrs.composable.js +77 -0
  224. package/src/ui.form-switch/configs/default.config.js +76 -0
  225. package/src/ui.form-switch/constants/index.js +5 -0
  226. package/src/ui.form-switch/index.stories.js +93 -0
  227. package/src/ui.form-switch/index.vue +198 -0
  228. package/src/ui.form-switch/services/variant.service.js +31 -0
  229. package/src/ui.form-textarea/Docs.mdx +16 -0
  230. package/src/ui.form-textarea/composables/attrs.composable.js +52 -0
  231. package/src/ui.form-textarea/configs/default.config.js +68 -0
  232. package/src/ui.form-textarea/constants/index.js +5 -0
  233. package/src/ui.form-textarea/index.stories.js +151 -0
  234. package/src/ui.form-textarea/index.vue +284 -0
  235. package/src/ui.image-avatar/composables/attrs.composable.js +34 -0
  236. package/src/ui.image-avatar/configs/default.config.js +42 -0
  237. package/src/ui.image-avatar/constants/index.js +5 -0
  238. package/src/ui.image-avatar/default-avatar.png +0 -0
  239. package/src/ui.image-avatar/index.stories.js +107 -0
  240. package/src/ui.image-avatar/index.vue +121 -0
  241. package/src/ui.image-icon/Docs.mdx +16 -0
  242. package/src/ui.image-icon/index.stories.js +110 -0
  243. package/src/ui.image-logo/configs/default.config.js +38 -0
  244. package/src/ui.image-logo/index.stories.js +84 -0
  245. package/src/ui.loader-top/components/TopProgress.vue +277 -0
  246. package/src/ui.navigation-pagination/composables/attrs.composable.js +41 -0
  247. package/src/ui.navigation-pagination/configs/default.config.js +24 -0
  248. package/src/ui.navigation-pagination/constants/index.js +8 -0
  249. package/src/ui.navigation-pagination/index.stories.js +52 -0
  250. package/src/ui.navigation-pagination/index.vue +275 -0
  251. package/src/ui.navigation-stepper/composables/attrs.composable.js +25 -0
  252. package/src/ui.navigation-stepper/configs/default.config.js +13 -0
  253. package/src/ui.navigation-stepper/constants/index.js +5 -0
  254. package/src/ui.navigation-stepper/index.stories.js +30 -0
  255. package/src/ui.navigation-stepper/index.vue +128 -0
  256. package/src/ui.navigation-tab/composables/attrs.composable.js +30 -0
  257. package/src/ui.navigation-tab/configs/default.config.js +22 -0
  258. package/src/ui.navigation-tab/constants/index.js +5 -0
  259. package/src/ui.navigation-tab/index.stories.js +57 -0
  260. package/src/ui.navigation-tab/index.vue +85 -0
  261. package/src/ui.navigation-tabs/composables/attrs.composable.js +24 -0
  262. package/src/ui.navigation-tabs/configs/default.config.js +14 -0
  263. package/src/ui.navigation-tabs/constants/index.js +5 -0
  264. package/src/ui.navigation-tabs/index.stories.js +69 -0
  265. package/src/ui.navigation-tabs/index.vue +99 -0
  266. package/src/ui.notify/index.stories.js +102 -0
  267. package/src/ui.other-dot/composables/attrs.composable.js +32 -0
  268. package/src/ui.other-dot/configs/default.config.js +21 -0
  269. package/src/ui.other-dot/constants/index.js +5 -0
  270. package/src/ui.other-dot/index.stories.js +77 -0
  271. package/src/ui.other-dot/index.vue +52 -0
  272. package/src/ui.other-loader/composables/attrs.composable.js +51 -0
  273. package/src/ui.other-loader/configs/default.config.js +47 -0
  274. package/src/ui.other-loader/constants/index.js +5 -0
  275. package/src/ui.other-loader/index.stories.js +78 -0
  276. package/src/ui.other-loader/index.vue +136 -0
  277. package/src/ui.text-alert/composables/attrs.composable.js +48 -0
  278. package/src/ui.text-alert/configs/default.config.js +51 -0
  279. package/src/ui.text-alert/constatns/index.js +5 -0
  280. package/src/ui.text-alert/index.stories.js +157 -0
  281. package/src/ui.text-alert/index.vue +121 -0
  282. package/src/ui.text-badge/Docs.mdx +16 -0
  283. package/src/ui.text-badge/composables/attrs.composable.js +49 -0
  284. package/src/ui.text-badge/configs/default.config.js +51 -0
  285. package/src/ui.text-badge/constants/index.js +5 -0
  286. package/src/ui.text-badge/index.stories.js +190 -0
  287. package/src/ui.text-badge/index.vue +120 -0
  288. package/src/ui.text-block/composables/attrs.composable.js +31 -0
  289. package/src/ui.text-block/configs/default.config.js +35 -0
  290. package/src/ui.text-block/constatns/index.js +5 -0
  291. package/src/ui.text-block/index.stories.js +112 -0
  292. package/src/ui.text-block/index.vue +76 -0
  293. package/src/ui.text-empty/Docs.mdx +16 -0
  294. package/src/ui.text-empty/configs/default.config.js +30 -0
  295. package/src/ui.text-empty/index.stories.js +106 -0
  296. package/src/ui.text-file/composables/attrs.composable.js +37 -0
  297. package/src/ui.text-file/configs/default.config.js +15 -0
  298. package/src/ui.text-file/index.stories.js +29 -0
  299. package/src/ui.text-file/index.vue +93 -0
  300. package/src/ui.text-files/composables/attrs.composable.js +19 -0
  301. package/src/ui.text-files/configs/default.config.js +9 -0
  302. package/src/ui.text-files/constants/index.js +5 -0
  303. package/src/ui.text-files/index.stories.js +32 -0
  304. package/src/ui.text-files/index.vue +87 -0
  305. package/src/ui.text-header/Docs.mdx +16 -0
  306. package/src/ui.text-header/composables/attrs.composable.js +34 -0
  307. package/src/ui.text-header/constants/index.js +5 -0
  308. package/src/ui.text-header/index.stories.js +106 -0
  309. package/src/ui.text-header/index.vue +83 -0
  310. package/src/ui.text-money/Docs.mdx +16 -0
  311. package/src/ui.text-money/assets/credit.svg +7 -0
  312. package/src/ui.text-money/assets/debit.svg +12 -0
  313. package/src/ui.text-money/composables/attrs.composable.js +65 -0
  314. package/src/ui.text-money/constants/index.js +7 -0
  315. package/src/ui.text-money/index.stories.js +265 -0
  316. package/src/ui.text-money/index.vue +204 -0
  317. package/src/ui.text-money/services/money.services.js +24 -0
  318. package/src/ui.viewport/index.vue +78 -0
@@ -0,0 +1,264 @@
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 from "../service.ui";
41
+ import { getRandomId } from "../service.ui";
42
+
43
+ import { SYMBOL_MINUS } from "../ui.text-money/constants";
44
+
45
+ import defaultConfig from "./configs/default.config";
46
+ import { UInputMoney } from "./constants";
47
+
48
+ import useAttrs from "./composables/attrs.composable";
49
+ import useFormatCurrency from "./composables/useFormatCurrency";
50
+
51
+ /* Should be a string for correct web-types gen */
52
+ defineOptions({ name: "UInputMoney", inheritAttrs: false });
53
+
54
+ const props = defineProps({
55
+ /**
56
+ * Input value.
57
+ */
58
+ modelValue: {
59
+ type: [String, Number],
60
+ default: "",
61
+ },
62
+ /**
63
+ * Input label.
64
+ */
65
+ label: {
66
+ type: String,
67
+ default: "",
68
+ },
69
+
70
+ /**
71
+ * Show label outside the input block.
72
+ */
73
+ labelOutside: {
74
+ type: Boolean,
75
+ default: UIService.get(defaultConfig, UInputMoney).default.labelOutside,
76
+ },
77
+
78
+ /**
79
+ * Currency symbol.
80
+ */
81
+ symbol: {
82
+ type: String,
83
+ default: UIService.get(defaultConfig, UInputMoney).default.symbol,
84
+ },
85
+
86
+ /**
87
+ * Input placeholder.
88
+ */
89
+ placeholder: {
90
+ type: String,
91
+ default: "",
92
+ },
93
+
94
+ /**
95
+ * Input description.
96
+ */
97
+ description: {
98
+ type: String,
99
+ default: "",
100
+ },
101
+
102
+ /**
103
+ * Error message.
104
+ */
105
+ error: {
106
+ type: String,
107
+ default: "",
108
+ },
109
+
110
+ /**
111
+ * Input size.
112
+ * @values sm, md, lg
113
+ */
114
+ size: {
115
+ type: String,
116
+ default: UIService.get(defaultConfig, UInputMoney).default.size,
117
+ },
118
+
119
+ /**
120
+ * Number of signs after the comma.
121
+ */
122
+ decimalScale: {
123
+ type: Number,
124
+ default: UIService.get(defaultConfig, UInputMoney).default.decimalScale,
125
+ },
126
+
127
+ /**
128
+ * A symbol used to separate the integer part from the fractional part of a number.
129
+ */
130
+ decimalSeparator: {
131
+ type: String,
132
+ default: UIService.get(defaultConfig, UInputMoney).default.decimalSeparator,
133
+ },
134
+
135
+ /**
136
+ * A symbol used to separate the thousand parts of a number.
137
+ */
138
+ thousandsSeparator: {
139
+ type: String,
140
+ default: UIService.get(defaultConfig, UInputMoney).default.thousandsSeparator,
141
+ },
142
+
143
+ /**
144
+ * Allow only positive values.
145
+ */
146
+ positiveOnly: {
147
+ type: Boolean,
148
+ default: UIService.get(defaultConfig, UInputMoney).default.positiveOnly,
149
+ },
150
+
151
+ /**
152
+ * Show prefix in the raw value number.
153
+ */
154
+ rawValuePrefix: {
155
+ type: Boolean,
156
+ default: UIService.get(defaultConfig, UInputMoney).default.rawValuePrefix,
157
+ },
158
+
159
+ /**
160
+ * Show minus sign.
161
+ */
162
+ minus: {
163
+ type: Boolean,
164
+ default: UIService.get(defaultConfig, UInputMoney).default.minus,
165
+ },
166
+
167
+ /**
168
+ * Set input read-only.
169
+ */
170
+ readonly: {
171
+ type: Boolean,
172
+ default: UIService.get(defaultConfig, UInputMoney).default.readonly,
173
+ },
174
+
175
+ /**
176
+ * Disable the input.
177
+ */
178
+ disabled: {
179
+ type: Boolean,
180
+ default: UIService.get(defaultConfig, UInputMoney).default.disabled,
181
+ },
182
+
183
+ /**
184
+ * Unique element id.
185
+ * @ignore
186
+ */
187
+ id: {
188
+ type: String,
189
+ default: () => getRandomId(),
190
+ },
191
+
192
+ /**
193
+ * Component ui config object.
194
+ */
195
+ config: {
196
+ type: Object,
197
+ default: () => ({}),
198
+ },
199
+
200
+ /**
201
+ * Data-cy attribute for automated testing.
202
+ */
203
+ dataCy: {
204
+ type: String,
205
+ default: "",
206
+ },
207
+ });
208
+
209
+ const emit = defineEmits(["update:modelValue", "keyup", "blur", "input"]);
210
+
211
+ const moneyInputRef = ref(null);
212
+
213
+ const { inputAttrs } = useAttrs(props);
214
+
215
+ const { formattedValue, rawValue, setValue } = useFormatCurrency(`#${props.id}`, () => ({
216
+ decimalScale: props.decimalScale,
217
+ decimalSeparator: props.decimalSeparator,
218
+ thousandsSeparator: props.thousandsSeparator,
219
+ positiveOnly: props.positiveOnly,
220
+ rawValuePrefix: props.rawValuePrefix,
221
+ prefix: props.minus ? SYMBOL_MINUS : "",
222
+ }));
223
+
224
+ const localValue = computed({
225
+ get: () => props.modelValue,
226
+ set: (value) => emit("update:modelValue", value),
227
+ });
228
+
229
+ const localLabel = computed(() => {
230
+ const comma = props.symbol && props.label ? "," : "";
231
+ const symbol = props.label ? props.symbol : "";
232
+
233
+ return `${props.label}${comma} ${symbol}`.trim();
234
+ });
235
+
236
+ const input = computed(() => {
237
+ return moneyInputRef.value.input;
238
+ });
239
+
240
+ watch(
241
+ () => props.modelValue,
242
+ () => String(localValue.value) !== String(rawValue.value) && setValue(localValue.value),
243
+ );
244
+
245
+ defineExpose({ input, rawValue, formattedValue });
246
+
247
+ onMounted(() => {
248
+ setValue(localValue.value);
249
+ });
250
+
251
+ function onKeyup(event) {
252
+ localValue.value = rawValue.value || "";
253
+
254
+ nextTick(() => emit("keyup", event));
255
+ }
256
+
257
+ function onBlur() {
258
+ nextTick(() => emit("blur"));
259
+ }
260
+
261
+ function onInput(value) {
262
+ nextTick(() => emit("input", value));
263
+ }
264
+ </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,159 @@
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
+ import UIService from "../service.ui";
51
+
52
+ import defaultConfig from "./configs/default.config";
53
+ import { UInputNumber } from "./constants";
54
+ import { useAttrs } from "./composables/attrs.composable";
55
+
56
+ /* Should be a string for correct web-types gen */
57
+ defineOptions({ name: "UInputNumber", inheritAttrs: false });
58
+
59
+ const props = defineProps({
60
+ /**
61
+ * Input value.
62
+ */
63
+ modelValue: {
64
+ type: Number,
65
+ required: true,
66
+ },
67
+
68
+ /**
69
+ * Input step.
70
+ */
71
+ step: {
72
+ type: Number,
73
+ default: 1,
74
+ },
75
+
76
+ /**
77
+ * Input min value.
78
+ */
79
+ min: {
80
+ type: Number,
81
+ default: 1,
82
+ },
83
+
84
+ /**
85
+ * Input max value.
86
+ */
87
+ max: {
88
+ type: Number,
89
+ default: 999,
90
+ },
91
+
92
+ /**
93
+ * Input label below number.
94
+ */
95
+ label: {
96
+ type: String,
97
+ default: "",
98
+ },
99
+
100
+ /**
101
+ * Input size.
102
+ * @values sm, md, lg
103
+ */
104
+ size: {
105
+ type: String,
106
+ default: UIService.get(defaultConfig, UInputNumber).default.size,
107
+ },
108
+
109
+ /**
110
+ * Component ui config object.
111
+ */
112
+ config: {
113
+ type: Object,
114
+ default: () => ({}),
115
+ },
116
+
117
+ /**
118
+ * Data-cy attribute for automated testing.
119
+ */
120
+ dataCy: {
121
+ type: String,
122
+ default: "",
123
+ },
124
+ });
125
+
126
+ const emit = defineEmits(["update:modelValue"]);
127
+
128
+ const {
129
+ config,
130
+ valueAttrs,
131
+ textAttrs,
132
+ removeButtonAttrs,
133
+ removeIconAttrs,
134
+ addButtonAttrs,
135
+ addIconAttrs,
136
+ wrapperAttrs,
137
+ numberAttrs,
138
+ } = useAttrs(props);
139
+
140
+ const count = computed({
141
+ get: () => props.modelValue,
142
+ set: (value) => emit("update:modelValue", value),
143
+ });
144
+
145
+ const isAddButtonDisabled = computed(() => count.value >= props.max);
146
+ const isRemoveButtonDisabled = computed(() => count.value <= props.min);
147
+
148
+ function onClickRemove() {
149
+ const newCount = count.value - props.step;
150
+
151
+ count.value = newCount >= props.min ? newCount : count.value;
152
+ }
153
+
154
+ function onClickAdd() {
155
+ const newCount = count.value + props.step;
156
+
157
+ count.value = newCount <= props.max ? newCount : count.value;
158
+ }
159
+ </script>