shad-m 1.0.0 → 1.0.2

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 (628) hide show
  1. package/dist/common/interactive/list.d.ts +1 -1
  2. package/dist/common/interactive/select/variants.d.ts +1 -1
  3. package/dist/components/alert-dialog.d.ts +2 -2
  4. package/dist/components/badge.d.ts +3 -3
  5. package/dist/components/button.d.ts +4 -4
  6. package/dist/components/chip.d.ts +2 -2
  7. package/dist/components/command.d.ts +7 -7
  8. package/dist/components/dialog.d.ts +2 -2
  9. package/dist/components/input-otp.d.ts +2 -2
  10. package/dist/components/resizable.d.ts +1 -1
  11. package/dist/components/sidebar.d.ts +1 -1
  12. package/dist/components/spinner.d.ts +2 -2
  13. package/dist/components/stepper.d.ts +3 -3
  14. package/dist/components/toggle-group.d.ts +2 -2
  15. package/dist/components/toggle.d.ts +2 -2
  16. package/dist/index.css +43 -0
  17. package/dist/index.css.map +1 -0
  18. package/dist/index.d.ts +59 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +8189 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/index.mjs +7846 -0
  23. package/dist/index.mjs.map +1 -0
  24. package/package.json +34 -2
  25. package/dist/assets/Animation/index.js +0 -180
  26. package/dist/assets/Animation/index.js.map +0 -1
  27. package/dist/assets/Animation/index.mjs +0 -79
  28. package/dist/assets/Animation/index.mjs.map +0 -1
  29. package/dist/assets/Icon/index.js +0 -2102
  30. package/dist/assets/Icon/index.js.map +0 -1
  31. package/dist/assets/Icon/index.mjs +0 -421
  32. package/dist/assets/Icon/index.mjs.map +0 -1
  33. package/dist/assets/Image/index.js +0 -755
  34. package/dist/assets/Image/index.js.map +0 -1
  35. package/dist/assets/Image/index.mjs +0 -150
  36. package/dist/assets/Image/index.mjs.map +0 -1
  37. package/dist/common/display/countdown.js +0 -68
  38. package/dist/common/display/countdown.js.map +0 -1
  39. package/dist/common/display/countdown.mjs +0 -46
  40. package/dist/common/display/countdown.mjs.map +0 -1
  41. package/dist/common/display/display-field-group.js +0 -91
  42. package/dist/common/display/display-field-group.js.map +0 -1
  43. package/dist/common/display/display-field-group.mjs +0 -89
  44. package/dist/common/display/display-field-group.mjs.map +0 -1
  45. package/dist/common/display/display-field.js +0 -46
  46. package/dist/common/display/display-field.js.map +0 -1
  47. package/dist/common/display/display-field.mjs +0 -40
  48. package/dist/common/display/display-field.mjs.map +0 -1
  49. package/dist/common/display/display-html-string.js +0 -52
  50. package/dist/common/display/display-html-string.js.map +0 -1
  51. package/dist/common/display/display-html-string.mjs +0 -30
  52. package/dist/common/display/display-html-string.mjs.map +0 -1
  53. package/dist/common/display/index.js +0 -59
  54. package/dist/common/display/index.js.map +0 -1
  55. package/dist/common/display/index.mjs +0 -10
  56. package/dist/common/display/index.mjs.map +0 -1
  57. package/dist/common/display/page-breadcrumb.js +0 -43
  58. package/dist/common/display/page-breadcrumb.js.map +0 -1
  59. package/dist/common/display/page-breadcrumb.mjs +0 -37
  60. package/dist/common/display/page-breadcrumb.mjs.map +0 -1
  61. package/dist/common/display/page-v2.js +0 -58
  62. package/dist/common/display/page-v2.js.map +0 -1
  63. package/dist/common/display/page-v2.mjs +0 -20
  64. package/dist/common/display/page-v2.mjs.map +0 -1
  65. package/dist/common/display/page.js +0 -155
  66. package/dist/common/display/page.js.map +0 -1
  67. package/dist/common/display/page.mjs +0 -138
  68. package/dist/common/display/page.mjs.map +0 -1
  69. package/dist/common/display/score-meter.js +0 -161
  70. package/dist/common/display/score-meter.js.map +0 -1
  71. package/dist/common/display/score-meter.mjs +0 -140
  72. package/dist/common/display/score-meter.mjs.map +0 -1
  73. package/dist/common/display/sidebar/app-sidebar.js +0 -114
  74. package/dist/common/display/sidebar/app-sidebar.js.map +0 -1
  75. package/dist/common/display/sidebar/app-sidebar.mjs +0 -92
  76. package/dist/common/display/sidebar/app-sidebar.mjs.map +0 -1
  77. package/dist/common/display/sidebar/index.js +0 -89
  78. package/dist/common/display/sidebar/index.js.map +0 -1
  79. package/dist/common/display/sidebar/index.mjs +0 -81
  80. package/dist/common/display/sidebar/index.mjs.map +0 -1
  81. package/dist/common/display/sidebar/nav-main.js +0 -406
  82. package/dist/common/display/sidebar/nav-main.js.map +0 -1
  83. package/dist/common/display/sidebar/nav-main.mjs +0 -400
  84. package/dist/common/display/sidebar/nav-main.mjs.map +0 -1
  85. package/dist/common/display/sidebar/sidebar-sheet.js +0 -140
  86. package/dist/common/display/sidebar/sidebar-sheet.js.map +0 -1
  87. package/dist/common/display/sidebar/sidebar-sheet.mjs +0 -118
  88. package/dist/common/display/sidebar/sidebar-sheet.mjs.map +0 -1
  89. package/dist/common/display/sidebar/types.js +0 -4
  90. package/dist/common/display/sidebar/types.js.map +0 -1
  91. package/dist/common/display/sidebar/types.mjs +0 -3
  92. package/dist/common/display/sidebar/types.mjs.map +0 -1
  93. package/dist/common/display/status-state.js +0 -97
  94. package/dist/common/display/status-state.js.map +0 -1
  95. package/dist/common/display/status-state.mjs +0 -88
  96. package/dist/common/display/status-state.mjs.map +0 -1
  97. package/dist/common/forms/auto-form.js +0 -101
  98. package/dist/common/forms/auto-form.js.map +0 -1
  99. package/dist/common/forms/auto-form.mjs +0 -78
  100. package/dist/common/forms/auto-form.mjs.map +0 -1
  101. package/dist/common/forms/form-field.js +0 -58
  102. package/dist/common/forms/form-field.js.map +0 -1
  103. package/dist/common/forms/form-field.mjs +0 -56
  104. package/dist/common/forms/form-field.mjs.map +0 -1
  105. package/dist/common/forms/form-input-field.js +0 -64
  106. package/dist/common/forms/form-input-field.js.map +0 -1
  107. package/dist/common/forms/form-input-field.mjs +0 -62
  108. package/dist/common/forms/form-input-field.mjs.map +0 -1
  109. package/dist/common/forms/index.js +0 -22
  110. package/dist/common/forms/index.js.map +0 -1
  111. package/dist/common/forms/index.mjs +0 -5
  112. package/dist/common/forms/index.mjs.map +0 -1
  113. package/dist/common/forms/switch-field.js +0 -106
  114. package/dist/common/forms/switch-field.js.map +0 -1
  115. package/dist/common/forms/switch-field.mjs +0 -104
  116. package/dist/common/forms/switch-field.mjs.map +0 -1
  117. package/dist/common/interactive/alert-dialog-wrapper.js +0 -141
  118. package/dist/common/interactive/alert-dialog-wrapper.js.map +0 -1
  119. package/dist/common/interactive/alert-dialog-wrapper.mjs +0 -119
  120. package/dist/common/interactive/alert-dialog-wrapper.mjs.map +0 -1
  121. package/dist/common/interactive/autocomplete.js +0 -178
  122. package/dist/common/interactive/autocomplete.js.map +0 -1
  123. package/dist/common/interactive/autocomplete.mjs +0 -157
  124. package/dist/common/interactive/autocomplete.mjs.map +0 -1
  125. package/dist/common/interactive/copy-tooltip.js +0 -152
  126. package/dist/common/interactive/copy-tooltip.js.map +0 -1
  127. package/dist/common/interactive/copy-tooltip.mjs +0 -143
  128. package/dist/common/interactive/copy-tooltip.mjs.map +0 -1
  129. package/dist/common/interactive/date-field.js +0 -303
  130. package/dist/common/interactive/date-field.js.map +0 -1
  131. package/dist/common/interactive/date-field.mjs +0 -281
  132. package/dist/common/interactive/date-field.mjs.map +0 -1
  133. package/dist/common/interactive/date-input/date-input.js +0 -68
  134. package/dist/common/interactive/date-input/date-input.js.map +0 -1
  135. package/dist/common/interactive/date-input/date-input.mjs +0 -62
  136. package/dist/common/interactive/date-input/date-input.mjs.map +0 -1
  137. package/dist/common/interactive/date-input/index.js +0 -17
  138. package/dist/common/interactive/date-input/index.js.map +0 -1
  139. package/dist/common/interactive/date-input/index.mjs +0 -4
  140. package/dist/common/interactive/date-input/index.mjs.map +0 -1
  141. package/dist/common/interactive/date-input/types.js +0 -4
  142. package/dist/common/interactive/date-input/types.js.map +0 -1
  143. package/dist/common/interactive/date-input/types.mjs +0 -3
  144. package/dist/common/interactive/date-input/types.mjs.map +0 -1
  145. package/dist/common/interactive/date-input/use-typed-date.js +0 -478
  146. package/dist/common/interactive/date-input/use-typed-date.js.map +0 -1
  147. package/dist/common/interactive/date-input/use-typed-date.mjs +0 -476
  148. package/dist/common/interactive/date-input/use-typed-date.mjs.map +0 -1
  149. package/dist/common/interactive/date-input/utils.js +0 -34
  150. package/dist/common/interactive/date-input/utils.js.map +0 -1
  151. package/dist/common/interactive/date-input/utils.mjs +0 -29
  152. package/dist/common/interactive/date-input/utils.mjs.map +0 -1
  153. package/dist/common/interactive/date-picker.js +0 -616
  154. package/dist/common/interactive/date-picker.js.map +0 -1
  155. package/dist/common/interactive/date-picker.mjs +0 -594
  156. package/dist/common/interactive/date-picker.mjs.map +0 -1
  157. package/dist/common/interactive/date-range-input/date-range-input.js +0 -82
  158. package/dist/common/interactive/date-range-input/date-range-input.js.map +0 -1
  159. package/dist/common/interactive/date-range-input/date-range-input.mjs +0 -76
  160. package/dist/common/interactive/date-range-input/date-range-input.mjs.map +0 -1
  161. package/dist/common/interactive/date-range-input/index.js +0 -12
  162. package/dist/common/interactive/date-range-input/index.js.map +0 -1
  163. package/dist/common/interactive/date-range-input/index.mjs +0 -3
  164. package/dist/common/interactive/date-range-input/index.mjs.map +0 -1
  165. package/dist/common/interactive/date-range-input/types.js +0 -4
  166. package/dist/common/interactive/date-range-input/types.js.map +0 -1
  167. package/dist/common/interactive/date-range-input/types.mjs +0 -3
  168. package/dist/common/interactive/date-range-input/types.mjs.map +0 -1
  169. package/dist/common/interactive/date-range-input/use-typed-date-range.js +0 -602
  170. package/dist/common/interactive/date-range-input/use-typed-date-range.js.map +0 -1
  171. package/dist/common/interactive/date-range-input/use-typed-date-range.mjs +0 -600
  172. package/dist/common/interactive/date-range-input/use-typed-date-range.mjs.map +0 -1
  173. package/dist/common/interactive/date-time-picker.js +0 -215
  174. package/dist/common/interactive/date-time-picker.js.map +0 -1
  175. package/dist/common/interactive/date-time-picker.mjs +0 -213
  176. package/dist/common/interactive/date-time-picker.mjs.map +0 -1
  177. package/dist/common/interactive/dialog-wrapper.js +0 -124
  178. package/dist/common/interactive/dialog-wrapper.js.map +0 -1
  179. package/dist/common/interactive/dialog-wrapper.mjs +0 -102
  180. package/dist/common/interactive/dialog-wrapper.mjs.map +0 -1
  181. package/dist/common/interactive/filter.js +0 -287
  182. package/dist/common/interactive/filter.js.map +0 -1
  183. package/dist/common/interactive/filter.mjs +0 -280
  184. package/dist/common/interactive/filter.mjs.map +0 -1
  185. package/dist/common/interactive/index.js +0 -235
  186. package/dist/common/interactive/index.js.map +0 -1
  187. package/dist/common/interactive/index.mjs +0 -24
  188. package/dist/common/interactive/index.mjs.map +0 -1
  189. package/dist/common/interactive/list.js +0 -160
  190. package/dist/common/interactive/list.js.map +0 -1
  191. package/dist/common/interactive/list.mjs +0 -134
  192. package/dist/common/interactive/list.mjs.map +0 -1
  193. package/dist/common/interactive/otp-dialog/index.js +0 -35
  194. package/dist/common/interactive/otp-dialog/index.js.map +0 -1
  195. package/dist/common/interactive/otp-dialog/index.mjs +0 -6
  196. package/dist/common/interactive/otp-dialog/index.mjs.map +0 -1
  197. package/dist/common/interactive/otp-dialog/otp-dialog.js +0 -325
  198. package/dist/common/interactive/otp-dialog/otp-dialog.js.map +0 -1
  199. package/dist/common/interactive/otp-dialog/otp-dialog.mjs +0 -303
  200. package/dist/common/interactive/otp-dialog/otp-dialog.mjs.map +0 -1
  201. package/dist/common/interactive/otp-dialog/reducer.js +0 -40
  202. package/dist/common/interactive/otp-dialog/reducer.js.map +0 -1
  203. package/dist/common/interactive/otp-dialog/reducer.mjs +0 -37
  204. package/dist/common/interactive/otp-dialog/reducer.mjs.map +0 -1
  205. package/dist/common/interactive/otp-dialog/types.js +0 -15
  206. package/dist/common/interactive/otp-dialog/types.js.map +0 -1
  207. package/dist/common/interactive/otp-dialog/types.mjs +0 -13
  208. package/dist/common/interactive/otp-dialog/types.mjs.map +0 -1
  209. package/dist/common/interactive/otp-dialog/utils.js +0 -24
  210. package/dist/common/interactive/otp-dialog/utils.js.map +0 -1
  211. package/dist/common/interactive/otp-dialog/utils.mjs +0 -21
  212. package/dist/common/interactive/otp-dialog/utils.mjs.map +0 -1
  213. package/dist/common/interactive/pagination/PaginationSkeleton.js +0 -51
  214. package/dist/common/interactive/pagination/PaginationSkeleton.js.map +0 -1
  215. package/dist/common/interactive/pagination/PaginationSkeleton.mjs +0 -49
  216. package/dist/common/interactive/pagination/PaginationSkeleton.mjs.map +0 -1
  217. package/dist/common/interactive/pagination/index.js +0 -235
  218. package/dist/common/interactive/pagination/index.js.map +0 -1
  219. package/dist/common/interactive/pagination/index.mjs +0 -223
  220. package/dist/common/interactive/pagination/index.mjs.map +0 -1
  221. package/dist/common/interactive/pagination/usePagination.js +0 -28
  222. package/dist/common/interactive/pagination/usePagination.js.map +0 -1
  223. package/dist/common/interactive/pagination/usePagination.mjs +0 -25
  224. package/dist/common/interactive/pagination/usePagination.mjs.map +0 -1
  225. package/dist/common/interactive/popover-wrapper.js +0 -138
  226. package/dist/common/interactive/popover-wrapper.js.map +0 -1
  227. package/dist/common/interactive/popover-wrapper.mjs +0 -116
  228. package/dist/common/interactive/popover-wrapper.mjs.map +0 -1
  229. package/dist/common/interactive/pressable.js +0 -84
  230. package/dist/common/interactive/pressable.js.map +0 -1
  231. package/dist/common/interactive/pressable.mjs +0 -62
  232. package/dist/common/interactive/pressable.mjs.map +0 -1
  233. package/dist/common/interactive/select/context.js +0 -38
  234. package/dist/common/interactive/select/context.js.map +0 -1
  235. package/dist/common/interactive/select/context.mjs +0 -14
  236. package/dist/common/interactive/select/context.mjs.map +0 -1
  237. package/dist/common/interactive/select/index.js +0 -123
  238. package/dist/common/interactive/select/index.js.map +0 -1
  239. package/dist/common/interactive/select/index.mjs +0 -18
  240. package/dist/common/interactive/select/index.mjs.map +0 -1
  241. package/dist/common/interactive/select/select-body.js +0 -89
  242. package/dist/common/interactive/select/select-body.js.map +0 -1
  243. package/dist/common/interactive/select/select-body.mjs +0 -67
  244. package/dist/common/interactive/select/select-body.mjs.map +0 -1
  245. package/dist/common/interactive/select/select-close.js +0 -38
  246. package/dist/common/interactive/select/select-close.js.map +0 -1
  247. package/dist/common/interactive/select/select-close.mjs +0 -16
  248. package/dist/common/interactive/select/select-close.mjs.map +0 -1
  249. package/dist/common/interactive/select/select-content-auto-layout.js +0 -221
  250. package/dist/common/interactive/select/select-content-auto-layout.js.map +0 -1
  251. package/dist/common/interactive/select/select-content-auto-layout.mjs +0 -199
  252. package/dist/common/interactive/select/select-content-auto-layout.mjs.map +0 -1
  253. package/dist/common/interactive/select/select-content-group-auto-layout.js +0 -411
  254. package/dist/common/interactive/select/select-content-group-auto-layout.js.map +0 -1
  255. package/dist/common/interactive/select/select-content-group-auto-layout.mjs +0 -389
  256. package/dist/common/interactive/select/select-content-group-auto-layout.mjs.map +0 -1
  257. package/dist/common/interactive/select/select-content.js +0 -187
  258. package/dist/common/interactive/select/select-content.js.map +0 -1
  259. package/dist/common/interactive/select/select-content.mjs +0 -165
  260. package/dist/common/interactive/select/select-content.mjs.map +0 -1
  261. package/dist/common/interactive/select/select-footer.js +0 -82
  262. package/dist/common/interactive/select/select-footer.js.map +0 -1
  263. package/dist/common/interactive/select/select-footer.mjs +0 -60
  264. package/dist/common/interactive/select/select-footer.mjs.map +0 -1
  265. package/dist/common/interactive/select/select-item.js +0 -214
  266. package/dist/common/interactive/select/select-item.js.map +0 -1
  267. package/dist/common/interactive/select/select-item.mjs +0 -191
  268. package/dist/common/interactive/select/select-item.mjs.map +0 -1
  269. package/dist/common/interactive/select/select-layout.js +0 -66
  270. package/dist/common/interactive/select/select-layout.js.map +0 -1
  271. package/dist/common/interactive/select/select-layout.mjs +0 -41
  272. package/dist/common/interactive/select/select-layout.mjs.map +0 -1
  273. package/dist/common/interactive/select/select-search.js +0 -55
  274. package/dist/common/interactive/select/select-search.js.map +0 -1
  275. package/dist/common/interactive/select/select-search.mjs +0 -33
  276. package/dist/common/interactive/select/select-search.mjs.map +0 -1
  277. package/dist/common/interactive/select/select-states.js +0 -57
  278. package/dist/common/interactive/select/select-states.js.map +0 -1
  279. package/dist/common/interactive/select/select-states.mjs +0 -34
  280. package/dist/common/interactive/select/select-states.mjs.map +0 -1
  281. package/dist/common/interactive/select/select-trigger.js +0 -310
  282. package/dist/common/interactive/select/select-trigger.js.map +0 -1
  283. package/dist/common/interactive/select/select-trigger.mjs +0 -286
  284. package/dist/common/interactive/select/select-trigger.mjs.map +0 -1
  285. package/dist/common/interactive/select/select-value.js +0 -52
  286. package/dist/common/interactive/select/select-value.js.map +0 -1
  287. package/dist/common/interactive/select/select-value.mjs +0 -30
  288. package/dist/common/interactive/select/select-value.mjs.map +0 -1
  289. package/dist/common/interactive/select/select.js +0 -184
  290. package/dist/common/interactive/select/select.js.map +0 -1
  291. package/dist/common/interactive/select/select.mjs +0 -162
  292. package/dist/common/interactive/select/select.mjs.map +0 -1
  293. package/dist/common/interactive/select/types.js +0 -4
  294. package/dist/common/interactive/select/types.js.map +0 -1
  295. package/dist/common/interactive/select/types.mjs +0 -3
  296. package/dist/common/interactive/select/types.mjs.map +0 -1
  297. package/dist/common/interactive/select/utils.js +0 -31
  298. package/dist/common/interactive/select/utils.js.map +0 -1
  299. package/dist/common/interactive/select/utils.mjs +0 -28
  300. package/dist/common/interactive/select/utils.mjs.map +0 -1
  301. package/dist/common/interactive/select/variants.js +0 -27
  302. package/dist/common/interactive/select/variants.js.map +0 -1
  303. package/dist/common/interactive/select/variants.mjs +0 -25
  304. package/dist/common/interactive/select/variants.mjs.map +0 -1
  305. package/dist/common/interactive/select-chip.js +0 -76
  306. package/dist/common/interactive/select-chip.js.map +0 -1
  307. package/dist/common/interactive/select-chip.mjs +0 -74
  308. package/dist/common/interactive/select-chip.mjs.map +0 -1
  309. package/dist/common/interactive/select-level.js +0 -236
  310. package/dist/common/interactive/select-level.js.map +0 -1
  311. package/dist/common/interactive/select-level.mjs +0 -230
  312. package/dist/common/interactive/select-level.mjs.map +0 -1
  313. package/dist/common/interactive/select-range.js +0 -211
  314. package/dist/common/interactive/select-range.js.map +0 -1
  315. package/dist/common/interactive/select-range.mjs +0 -209
  316. package/dist/common/interactive/select-range.mjs.map +0 -1
  317. package/dist/common/interactive/select-with-api.js +0 -767
  318. package/dist/common/interactive/select-with-api.js.map +0 -1
  319. package/dist/common/interactive/select-with-api.mjs +0 -758
  320. package/dist/common/interactive/select-with-api.mjs.map +0 -1
  321. package/dist/common/interactive/select.js +0 -15
  322. package/dist/common/interactive/select.js.map +0 -1
  323. package/dist/common/interactive/select.mjs +0 -4
  324. package/dist/common/interactive/select.mjs.map +0 -1
  325. package/dist/common/interactive/sheet-wrapper.js +0 -105
  326. package/dist/common/interactive/sheet-wrapper.js.map +0 -1
  327. package/dist/common/interactive/sheet-wrapper.mjs +0 -83
  328. package/dist/common/interactive/sheet-wrapper.mjs.map +0 -1
  329. package/dist/common/interactive/table/enhanced-table.js +0 -390
  330. package/dist/common/interactive/table/enhanced-table.js.map +0 -1
  331. package/dist/common/interactive/table/enhanced-table.mjs +0 -388
  332. package/dist/common/interactive/table/enhanced-table.mjs.map +0 -1
  333. package/dist/common/interactive/table/index.js +0 -83
  334. package/dist/common/interactive/table/index.js.map +0 -1
  335. package/dist/common/interactive/table/index.mjs +0 -68
  336. package/dist/common/interactive/table/index.mjs.map +0 -1
  337. package/dist/common/interactive/table/table-pagination.js +0 -12
  338. package/dist/common/interactive/table/table-pagination.js.map +0 -1
  339. package/dist/common/interactive/table/table-pagination.mjs +0 -10
  340. package/dist/common/interactive/table/table-pagination.mjs.map +0 -1
  341. package/dist/common/interactive/table/types.js +0 -4
  342. package/dist/common/interactive/table/types.js.map +0 -1
  343. package/dist/common/interactive/table/types.mjs +0 -3
  344. package/dist/common/interactive/table/types.mjs.map +0 -1
  345. package/dist/common/interactive/time-picker.js +0 -313
  346. package/dist/common/interactive/time-picker.js.map +0 -1
  347. package/dist/common/interactive/time-picker.mjs +0 -307
  348. package/dist/common/interactive/time-picker.mjs.map +0 -1
  349. package/dist/common/interactive/types.js +0 -4
  350. package/dist/common/interactive/types.js.map +0 -1
  351. package/dist/common/interactive/types.mjs +0 -3
  352. package/dist/common/interactive/types.mjs.map +0 -1
  353. package/dist/common/pages/page-404.js +0 -16
  354. package/dist/common/pages/page-404.js.map +0 -1
  355. package/dist/common/pages/page-404.mjs +0 -11
  356. package/dist/common/pages/page-404.mjs.map +0 -1
  357. package/dist/common/pages/page-500.js +0 -30
  358. package/dist/common/pages/page-500.js.map +0 -1
  359. package/dist/common/pages/page-500.mjs +0 -25
  360. package/dist/common/pages/page-500.mjs.map +0 -1
  361. package/dist/components/accordion.js +0 -65
  362. package/dist/components/accordion.js.map +0 -1
  363. package/dist/components/accordion.mjs +0 -39
  364. package/dist/components/accordion.mjs.map +0 -1
  365. package/dist/components/alert-dialog.js +0 -231
  366. package/dist/components/alert-dialog.js.map +0 -1
  367. package/dist/components/alert-dialog.mjs +0 -197
  368. package/dist/components/alert-dialog.mjs.map +0 -1
  369. package/dist/components/alert.js +0 -97
  370. package/dist/components/alert.js.map +0 -1
  371. package/dist/components/alert.mjs +0 -72
  372. package/dist/components/alert.mjs.map +0 -1
  373. package/dist/components/aspect-ratio.js +0 -29
  374. package/dist/components/aspect-ratio.js.map +0 -1
  375. package/dist/components/aspect-ratio.mjs +0 -7
  376. package/dist/components/aspect-ratio.mjs.map +0 -1
  377. package/dist/components/avatar.js +0 -64
  378. package/dist/components/avatar.js.map +0 -1
  379. package/dist/components/avatar.mjs +0 -39
  380. package/dist/components/avatar.mjs.map +0 -1
  381. package/dist/components/badge.js +0 -72
  382. package/dist/components/badge.js.map +0 -1
  383. package/dist/components/badge.mjs +0 -69
  384. package/dist/components/badge.mjs.map +0 -1
  385. package/dist/components/breadcrumb.js +0 -109
  386. package/dist/components/breadcrumb.js.map +0 -1
  387. package/dist/components/breadcrumb.mjs +0 -81
  388. package/dist/components/breadcrumb.mjs.map +0 -1
  389. package/dist/components/button.js +0 -250
  390. package/dist/components/button.js.map +0 -1
  391. package/dist/components/button.mjs +0 -226
  392. package/dist/components/button.mjs.map +0 -1
  393. package/dist/components/calendar.js +0 -681
  394. package/dist/components/calendar.js.map +0 -1
  395. package/dist/components/calendar.mjs +0 -659
  396. package/dist/components/calendar.mjs.map +0 -1
  397. package/dist/components/card.js +0 -98
  398. package/dist/components/card.js.map +0 -1
  399. package/dist/components/card.mjs +0 -71
  400. package/dist/components/card.mjs.map +0 -1
  401. package/dist/components/carousel.js +0 -237
  402. package/dist/components/carousel.js.map +0 -1
  403. package/dist/components/carousel.mjs +0 -208
  404. package/dist/components/carousel.mjs.map +0 -1
  405. package/dist/components/chart.js +0 -252
  406. package/dist/components/chart.js.map +0 -1
  407. package/dist/components/chart.mjs +0 -224
  408. package/dist/components/chart.mjs.map +0 -1
  409. package/dist/components/checkbox.js +0 -97
  410. package/dist/components/checkbox.js.map +0 -1
  411. package/dist/components/checkbox.mjs +0 -74
  412. package/dist/components/checkbox.mjs.map +0 -1
  413. package/dist/components/chip.js +0 -88
  414. package/dist/components/chip.js.map +0 -1
  415. package/dist/components/chip.mjs +0 -82
  416. package/dist/components/chip.mjs.map +0 -1
  417. package/dist/components/collapsible.js +0 -33
  418. package/dist/components/collapsible.js.map +0 -1
  419. package/dist/components/collapsible.mjs +0 -9
  420. package/dist/components/collapsible.mjs.map +0 -1
  421. package/dist/components/command.js +0 -125
  422. package/dist/components/command.js.map +0 -1
  423. package/dist/components/command.mjs +0 -95
  424. package/dist/components/command.mjs.map +0 -1
  425. package/dist/components/context-menu.js +0 -168
  426. package/dist/components/context-menu.js.map +0 -1
  427. package/dist/components/context-menu.mjs +0 -131
  428. package/dist/components/context-menu.mjs.map +0 -1
  429. package/dist/components/dialog.js +0 -192
  430. package/dist/components/dialog.js.map +0 -1
  431. package/dist/components/dialog.mjs +0 -159
  432. package/dist/components/dialog.mjs.map +0 -1
  433. package/dist/components/drawer.js +0 -98
  434. package/dist/components/drawer.js.map +0 -1
  435. package/dist/components/drawer.mjs +0 -67
  436. package/dist/components/drawer.mjs.map +0 -1
  437. package/dist/components/dropdown-menu.js +0 -163
  438. package/dist/components/dropdown-menu.js.map +0 -1
  439. package/dist/components/dropdown-menu.mjs +0 -126
  440. package/dist/components/dropdown-menu.mjs.map +0 -1
  441. package/dist/components/form.js +0 -123
  442. package/dist/components/form.js.map +0 -1
  443. package/dist/components/form.mjs +0 -94
  444. package/dist/components/form.mjs.map +0 -1
  445. package/dist/components/hover-card.js +0 -50
  446. package/dist/components/hover-card.js.map +0 -1
  447. package/dist/components/hover-card.mjs +0 -25
  448. package/dist/components/hover-card.mjs.map +0 -1
  449. package/dist/components/input-otp.js +0 -84
  450. package/dist/components/input-otp.js.map +0 -1
  451. package/dist/components/input-otp.mjs +0 -59
  452. package/dist/components/input-otp.mjs.map +0 -1
  453. package/dist/components/input.js +0 -858
  454. package/dist/components/input.js.map +0 -1
  455. package/dist/components/input.mjs +0 -831
  456. package/dist/components/input.mjs.map +0 -1
  457. package/dist/components/label.js +0 -38
  458. package/dist/components/label.js.map +0 -1
  459. package/dist/components/label.mjs +0 -15
  460. package/dist/components/label.mjs.map +0 -1
  461. package/dist/components/lottie.js +0 -59
  462. package/dist/components/lottie.js.map +0 -1
  463. package/dist/components/lottie.mjs +0 -49
  464. package/dist/components/lottie.mjs.map +0 -1
  465. package/dist/components/menubar.js +0 -195
  466. package/dist/components/menubar.js.map +0 -1
  467. package/dist/components/menubar.mjs +0 -157
  468. package/dist/components/menubar.mjs.map +0 -1
  469. package/dist/components/navigation-menu.js +0 -126
  470. package/dist/components/navigation-menu.js.map +0 -1
  471. package/dist/components/navigation-menu.mjs +0 -95
  472. package/dist/components/navigation-menu.mjs.map +0 -1
  473. package/dist/components/pagination.js +0 -112
  474. package/dist/components/pagination.js.map +0 -1
  475. package/dist/components/pagination.mjs +0 -84
  476. package/dist/components/pagination.mjs.map +0 -1
  477. package/dist/components/popover.js +0 -63
  478. package/dist/components/popover.js.map +0 -1
  479. package/dist/components/popover.mjs +0 -38
  480. package/dist/components/popover.mjs.map +0 -1
  481. package/dist/components/progress.js +0 -50
  482. package/dist/components/progress.js.map +0 -1
  483. package/dist/components/progress.mjs +0 -27
  484. package/dist/components/progress.mjs.map +0 -1
  485. package/dist/components/radio-group.js +0 -91
  486. package/dist/components/radio-group.js.map +0 -1
  487. package/dist/components/radio-group.mjs +0 -67
  488. package/dist/components/radio-group.mjs.map +0 -1
  489. package/dist/components/resizable.js +0 -59
  490. package/dist/components/resizable.js.map +0 -1
  491. package/dist/components/resizable.mjs +0 -35
  492. package/dist/components/resizable.mjs.map +0 -1
  493. package/dist/components/responsive-popover.js +0 -74
  494. package/dist/components/responsive-popover.js.map +0 -1
  495. package/dist/components/responsive-popover.mjs +0 -50
  496. package/dist/components/responsive-popover.mjs.map +0 -1
  497. package/dist/components/scroll-area.js +0 -63
  498. package/dist/components/scroll-area.js.map +0 -1
  499. package/dist/components/scroll-area.mjs +0 -39
  500. package/dist/components/scroll-area.mjs.map +0 -1
  501. package/dist/components/separator.js +0 -47
  502. package/dist/components/separator.js.map +0 -1
  503. package/dist/components/separator.mjs +0 -24
  504. package/dist/components/separator.mjs.map +0 -1
  505. package/dist/components/sheet.js +0 -239
  506. package/dist/components/sheet.js.map +0 -1
  507. package/dist/components/sheet.mjs +0 -206
  508. package/dist/components/sheet.mjs.map +0 -1
  509. package/dist/components/sidebar.js +0 -888
  510. package/dist/components/sidebar.js.map +0 -1
  511. package/dist/components/sidebar.mjs +0 -842
  512. package/dist/components/sidebar.mjs.map +0 -1
  513. package/dist/components/skeleton.js +0 -153
  514. package/dist/components/skeleton.js.map +0 -1
  515. package/dist/components/skeleton.mjs +0 -127
  516. package/dist/components/skeleton.mjs.map +0 -1
  517. package/dist/components/slider.js +0 -45
  518. package/dist/components/slider.js.map +0 -1
  519. package/dist/components/slider.mjs +0 -22
  520. package/dist/components/slider.mjs.map +0 -1
  521. package/dist/components/sonner.js +0 -76
  522. package/dist/components/sonner.js.map +0 -1
  523. package/dist/components/sonner.mjs +0 -71
  524. package/dist/components/sonner.mjs.map +0 -1
  525. package/dist/components/spinner.js +0 -59
  526. package/dist/components/spinner.js.map +0 -1
  527. package/dist/components/spinner.mjs +0 -36
  528. package/dist/components/spinner.mjs.map +0 -1
  529. package/dist/components/stepper.js +0 -726
  530. package/dist/components/stepper.js.map +0 -1
  531. package/dist/components/stepper.mjs +0 -702
  532. package/dist/components/stepper.mjs.map +0 -1
  533. package/dist/components/switch.js +0 -85
  534. package/dist/components/switch.js.map +0 -1
  535. package/dist/components/switch.mjs +0 -62
  536. package/dist/components/switch.mjs.map +0 -1
  537. package/dist/components/table.js +0 -91
  538. package/dist/components/table.js.map +0 -1
  539. package/dist/components/table.mjs +0 -62
  540. package/dist/components/table.mjs.map +0 -1
  541. package/dist/components/tabs.js +0 -287
  542. package/dist/components/tabs.js.map +0 -1
  543. package/dist/components/tabs.mjs +0 -261
  544. package/dist/components/tabs.mjs.map +0 -1
  545. package/dist/components/textarea.js +0 -200
  546. package/dist/components/textarea.js.map +0 -1
  547. package/dist/components/textarea.mjs +0 -174
  548. package/dist/components/textarea.mjs.map +0 -1
  549. package/dist/components/toggle-group.js +0 -67
  550. package/dist/components/toggle-group.js.map +0 -1
  551. package/dist/components/toggle-group.mjs +0 -43
  552. package/dist/components/toggle-group.mjs.map +0 -1
  553. package/dist/components/toggle.js +0 -63
  554. package/dist/components/toggle.js.map +0 -1
  555. package/dist/components/toggle.mjs +0 -39
  556. package/dist/components/toggle.mjs.map +0 -1
  557. package/dist/components/tooltip.js +0 -172
  558. package/dist/components/tooltip.js.map +0 -1
  559. package/dist/components/tooltip.mjs +0 -145
  560. package/dist/components/tooltip.mjs.map +0 -1
  561. package/dist/hooks/index.js +0 -27
  562. package/dist/hooks/index.js.map +0 -1
  563. package/dist/hooks/index.mjs +0 -6
  564. package/dist/hooks/index.mjs.map +0 -1
  565. package/dist/hooks/useCopyToClipboard.js +0 -59
  566. package/dist/hooks/useCopyToClipboard.js.map +0 -1
  567. package/dist/hooks/useCopyToClipboard.mjs +0 -57
  568. package/dist/hooks/useCopyToClipboard.mjs.map +0 -1
  569. package/dist/hooks/useDevice.js +0 -20
  570. package/dist/hooks/useDevice.js.map +0 -1
  571. package/dist/hooks/useDevice.mjs +0 -14
  572. package/dist/hooks/useDevice.mjs.map +0 -1
  573. package/dist/hooks/useDialogTracking.js +0 -113
  574. package/dist/hooks/useDialogTracking.js.map +0 -1
  575. package/dist/hooks/useDialogTracking.mjs +0 -91
  576. package/dist/hooks/useDialogTracking.mjs.map +0 -1
  577. package/dist/hooks/useIsMounted.js +0 -15
  578. package/dist/hooks/useIsMounted.js.map +0 -1
  579. package/dist/hooks/useIsMounted.mjs +0 -13
  580. package/dist/hooks/useIsMounted.mjs.map +0 -1
  581. package/dist/hooks/usePathname.js +0 -85
  582. package/dist/hooks/usePathname.js.map +0 -1
  583. package/dist/hooks/usePathname.mjs +0 -83
  584. package/dist/hooks/usePathname.mjs.map +0 -1
  585. package/dist/icons.js +0 -14
  586. package/dist/icons.js.map +0 -1
  587. package/dist/icons.mjs +0 -3
  588. package/dist/icons.mjs.map +0 -1
  589. package/dist/lib/formatCurrency.js +0 -187
  590. package/dist/lib/formatCurrency.js.map +0 -1
  591. package/dist/lib/formatCurrency.mjs +0 -185
  592. package/dist/lib/formatCurrency.mjs.map +0 -1
  593. package/dist/lib/helpers.js +0 -171
  594. package/dist/lib/helpers.js.map +0 -1
  595. package/dist/lib/helpers.mjs +0 -157
  596. package/dist/lib/helpers.mjs.map +0 -1
  597. package/dist/lib/index.js +0 -33
  598. package/dist/lib/index.js.map +0 -1
  599. package/dist/lib/index.mjs +0 -6
  600. package/dist/lib/index.mjs.map +0 -1
  601. package/dist/lib/types.js +0 -11
  602. package/dist/lib/types.js.map +0 -1
  603. package/dist/lib/types.mjs +0 -9
  604. package/dist/lib/types.mjs.map +0 -1
  605. package/dist/lib/utils.js +0 -24
  606. package/dist/lib/utils.js.map +0 -1
  607. package/dist/lib/utils.mjs +0 -19
  608. package/dist/lib/utils.mjs.map +0 -1
  609. package/dist/providers/DeviceSizeWatcher/index.js +0 -72
  610. package/dist/providers/DeviceSizeWatcher/index.js.map +0 -1
  611. package/dist/providers/DeviceSizeWatcher/index.mjs +0 -47
  612. package/dist/providers/DeviceSizeWatcher/index.mjs.map +0 -1
  613. package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.js +0 -22
  614. package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.js.map +0 -1
  615. package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.mjs +0 -20
  616. package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.mjs.map +0 -1
  617. package/dist/providers/UISystemProvider.js +0 -197
  618. package/dist/providers/UISystemProvider.js.map +0 -1
  619. package/dist/providers/UISystemProvider.mjs +0 -188
  620. package/dist/providers/UISystemProvider.mjs.map +0 -1
  621. package/dist/providers/index.js +0 -24
  622. package/dist/providers/index.js.map +0 -1
  623. package/dist/providers/index.mjs +0 -3
  624. package/dist/providers/index.mjs.map +0 -1
  625. package/dist/theme.js +0 -333
  626. package/dist/theme.js.map +0 -1
  627. package/dist/theme.mjs +0 -327
  628. package/dist/theme.mjs.map +0 -1
@@ -1,187 +0,0 @@
1
- 'use strict';
2
-
3
- var readVietnameseNumber = require('read-vietnamese-number');
4
-
5
- function formatCurrency(value, options = {}) {
6
- const {
7
- thousandSeparator = ",",
8
- decimalSeparator = ".",
9
- decimalScale = 2,
10
- fixedDecimalScale = false,
11
- currency = "\u0111",
12
- currencyPosition = "suffix",
13
- showVietnameseText = false,
14
- vietnameseTextUnit = "\u0111\u1ED3ng",
15
- maxIntegerLength = 14,
16
- maxDecimalLength = 6,
17
- shortenedCurrencyDisplay = false,
18
- isRound = false
19
- } = options;
20
- let numericValue = 0;
21
- if (value !== null && value !== void 0 && value !== "") {
22
- if (typeof value === "string") {
23
- const cleanValue = value.replace(/[^\d,.]/g, "");
24
- let parseValue = cleanValue;
25
- if (decimalSeparator === "," && thousandSeparator === ".") {
26
- parseValue = cleanValue.replace(/,/g, ".");
27
- } else if (decimalSeparator === "." && thousandSeparator === ",") {
28
- parseValue = cleanValue.replace(/,/g, "");
29
- }
30
- numericValue = parseFloat(parseValue) || 0;
31
- } else {
32
- numericValue = value;
33
- }
34
- }
35
- if (numericValue < 0) {
36
- numericValue = 0;
37
- }
38
- const applyLengthConstraints = (num) => {
39
- const numStr = num.toString();
40
- const [integerPart, decimalPart] = numStr.split(".");
41
- if (integerPart && integerPart.length > maxIntegerLength) {
42
- const limitedInteger = integerPart.slice(0, maxIntegerLength);
43
- const limitedDecimal = decimalPart ? decimalPart.slice(0, maxDecimalLength) : "";
44
- return parseFloat(limitedDecimal ? `${limitedInteger}.${limitedDecimal}` : limitedInteger);
45
- }
46
- if (decimalPart && decimalPart.length > maxDecimalLength) {
47
- const limitedDecimal = decimalPart.slice(0, maxDecimalLength);
48
- return parseFloat(`${integerPart}.${limitedDecimal}`);
49
- }
50
- return num;
51
- };
52
- numericValue = applyLengthConstraints(numericValue);
53
- if (isRound) {
54
- numericValue = Math.round(numericValue);
55
- }
56
- const formatNumber = (num) => {
57
- if (thousandSeparator === false) {
58
- if (isRound) {
59
- return num.toFixed(fixedDecimalScale ? Math.min(decimalScale, maxDecimalLength) : 0);
60
- } else {
61
- if (fixedDecimalScale && decimalScale > 0) {
62
- const numStr2 = num.toString();
63
- const [integerPart2, decimalPart2] = numStr2.split(".");
64
- const targetDecimals = Math.min(decimalScale, maxDecimalLength);
65
- const currentDecimals = decimalPart2 || "";
66
- const formattedDecimals = currentDecimals.slice(0, targetDecimals).padEnd(targetDecimals, "0");
67
- return `${integerPart2}.${formattedDecimals}`;
68
- }
69
- return num.toString();
70
- }
71
- }
72
- const numStr = num.toString();
73
- const [integerPart, decimalPart] = numStr.split(".");
74
- let formattedInteger = integerPart || "0";
75
- if (thousandSeparator && formattedInteger.length > 3) {
76
- const separator = typeof thousandSeparator === "string" ? thousandSeparator : ",";
77
- formattedInteger = formattedInteger.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
78
- }
79
- let formattedDecimal = "";
80
- if (decimalPart || fixedDecimalScale) {
81
- const maxDecimals = Math.min(decimalScale, maxDecimalLength);
82
- const decimals = decimalPart || "";
83
- if (fixedDecimalScale) {
84
- if (isRound) {
85
- const rounded = Math.round(num * Math.pow(10, maxDecimals)) / Math.pow(10, maxDecimals);
86
- const roundedStr = rounded.toString();
87
- const [, roundedDecimal] = roundedStr.split(".");
88
- formattedDecimal = (roundedDecimal || "").padEnd(maxDecimals, "0").slice(0, maxDecimals);
89
- } else {
90
- formattedDecimal = decimals.slice(0, maxDecimals);
91
- if (maxDecimals > 0) {
92
- formattedDecimal = formattedDecimal.padEnd(maxDecimals, "0");
93
- }
94
- }
95
- if (formattedDecimal && !formattedDecimal.match(/^0+$/)) {
96
- formattedDecimal = decimalSeparator + formattedDecimal;
97
- } else if (maxDecimals > 0 && (decimals.length > 0 || !isRound)) {
98
- formattedDecimal = decimalSeparator + formattedDecimal;
99
- } else {
100
- formattedDecimal = "";
101
- }
102
- } else {
103
- formattedDecimal = decimals.slice(0, maxDecimals);
104
- if (formattedDecimal) {
105
- formattedDecimal = decimalSeparator + formattedDecimal;
106
- }
107
- }
108
- }
109
- return formattedInteger + formattedDecimal;
110
- };
111
- const formatted = formatNumber(numericValue);
112
- const formattedWithCurrency = currencyPosition === "prefix" ? `${currency}${formatted}` : `${formatted}${currency}`;
113
- let vietnameseText = "";
114
- if (showVietnameseText && numericValue > 0) {
115
- try {
116
- const config = new readVietnameseNumber.ReadingConfig();
117
- if (vietnameseTextUnit) {
118
- config.unit = [vietnameseTextUnit];
119
- }
120
- const result = readVietnameseNumber.doReadNumber(config, numericValue.toString());
121
- vietnameseText = result.charAt(0).toUpperCase() + result.slice(1);
122
- } catch (error) {
123
- if (!(error instanceof readVietnameseNumber.InvalidFormatError || error instanceof readVietnameseNumber.InvalidNumberError)) {
124
- console.warn("Error generating Vietnamese text:", error);
125
- }
126
- vietnameseText = "";
127
- }
128
- }
129
- let shortenedCurrencyText = "";
130
- if (shortenedCurrencyDisplay && numericValue > 0) {
131
- try {
132
- let shortValue = 0;
133
- let unit = "";
134
- if (numericValue >= 1e9) {
135
- shortValue = numericValue / 1e9;
136
- unit = "t\u1EF7";
137
- } else if (numericValue >= 1e6) {
138
- shortValue = numericValue / 1e6;
139
- unit = "tr";
140
- } else if (numericValue >= 1e3) {
141
- shortValue = numericValue / 1e3;
142
- unit = "k";
143
- } else {
144
- shortenedCurrencyText = formatted;
145
- unit = "";
146
- }
147
- if (unit) {
148
- const formatShortened = (num) => {
149
- const numStr = num.toString();
150
- const [integerPart, decimalPart] = numStr.split(".");
151
- let formattedInteger = integerPart || "0";
152
- if (formattedInteger.length > 3) {
153
- formattedInteger = formattedInteger.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
154
- }
155
- let formattedDecimal = "";
156
- if (decimalPart) {
157
- const maxDecimals = Math.min(decimalScale, 2);
158
- let decimals = decimalPart.slice(0, maxDecimals);
159
- decimals = decimals.replace(/0+$/, "");
160
- if (decimals) {
161
- formattedDecimal = "." + decimals;
162
- }
163
- }
164
- return formattedInteger + formattedDecimal;
165
- };
166
- const displayValue = formatShortened(shortValue);
167
- shortenedCurrencyText = `${displayValue} ${unit}`;
168
- }
169
- } catch (error) {
170
- console.warn("Error generating shortened currency text:", error);
171
- shortenedCurrencyText = "";
172
- }
173
- }
174
- const displayText = shortenedCurrencyDisplay && shortenedCurrencyText ? shortenedCurrencyText : showVietnameseText && vietnameseText ? vietnameseText : formattedWithCurrency;
175
- return {
176
- value: numericValue,
177
- formatted,
178
- formattedWithCurrency,
179
- vietnameseText,
180
- shortenedCurrencyText,
181
- displayText
182
- };
183
- }
184
-
185
- exports.formatCurrency = formatCurrency;
186
- //# sourceMappingURL=formatCurrency.js.map
187
- //# sourceMappingURL=formatCurrency.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/formatCurrency.ts"],"names":["numStr","integerPart","decimalPart","ReadingConfig","doReadNumber","InvalidFormatError","InvalidNumberError"],"mappings":"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","file":"formatCurrency.js","sourcesContent":["import {\n doReadNumber,\n InvalidFormatError,\n InvalidNumberError,\n ReadingConfig,\n} from 'read-vietnamese-number';\n\nexport interface CurrencyFormatOptions {\n /**\n * Thousand separator character\n * @default ',' (International format)\n */\n thousandSeparator?: string | boolean;\n\n /**\n * Decimal separator character\n * @default '.' (International format)\n */\n decimalSeparator?: string;\n\n /**\n * Number of decimal places\n * @default 2\n */\n decimalScale?: number;\n\n /**\n * Whether to use fixed decimal scale\n * @default false\n */\n fixedDecimalScale?: boolean;\n\n /**\n * Allow negative numbers\n * @default false\n */\n allowNegative?: boolean;\n\n /**\n * Currency symbol\n * @default 'đ'\n */\n currency?: string;\n\n /**\n * Currency position\n * @default 'suffix'\n */\n currencyPosition?: 'prefix' | 'suffix';\n\n /**\n * Show Vietnamese text reading\n * @default false\n */\n showVietnameseText?: boolean;\n\n /**\n * Vietnamese text unit\n * @default 'đồng'\n */\n vietnameseTextUnit?: string;\n\n /**\n * Locale for formatting\n * @default 'vi-VN'\n */\n locale?: string;\n\n /**\n * Maximum length for integer part (before decimal)\n * @default 14\n */\n maxIntegerLength?: number;\n\n /**\n * Maximum length for decimal part (after decimal)\n * @default 6\n */\n maxDecimalLength?: number;\n\n /**\n * Show shortened currency display (k, tr, tỷ)\n * @default false\n */\n shortenedCurrencyDisplay?: boolean;\n\n /**\n * Whether to round the number to remove decimal places\n * @default false\n */\n isRound?: boolean;\n}\n\nexport interface CurrencyFormatResult {\n /**\n * Raw numeric value\n */\n value: number;\n\n /**\n * Formatted value with thousand separators\n */\n formatted: string;\n\n /**\n * Formatted value with currency symbol\n */\n formattedWithCurrency: string;\n\n /**\n * Vietnamese text reading\n */\n vietnameseText: string;\n\n /**\n * Shortened currency text (k, tr, tỷ)\n */\n shortenedCurrencyText: string;\n\n /**\n * Display text (formatted + currency or vietnamese text based on options)\n */\n displayText: string;\n}\n\n/**\n * Function to format currency values with Vietnamese text support\n * @param value - The numeric value to format\n * @param options - Formatting options\n * @returns Formatted currency result\n */\nexport function formatCurrency(\n value: string | number | null | undefined,\n options: CurrencyFormatOptions = {},\n): CurrencyFormatResult {\n const {\n thousandSeparator = ',',\n decimalSeparator = '.',\n decimalScale = 2,\n fixedDecimalScale = false,\n currency = 'đ',\n currencyPosition = 'suffix',\n showVietnameseText = false,\n vietnameseTextUnit = 'đồng',\n maxIntegerLength = 14,\n maxDecimalLength = 6,\n shortenedCurrencyDisplay = false,\n isRound = false,\n } = options;\n\n // Parse input value\n let numericValue = 0;\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'string') {\n // Only allow digits, comma, and dots\n const cleanValue = value.replace(/[^\\d,.]/g, '');\n\n // Handle different separator formats\n let parseValue = cleanValue;\n if (decimalSeparator === ',' && thousandSeparator === '.') {\n // Vietnamese format: thousand='.', decimal=','\n // Replace comma with dot for parsing (since parseFloat expects dot as decimal)\n parseValue = cleanValue.replace(/,/g, '.');\n } else if (decimalSeparator === '.' && thousandSeparator === ',') {\n // International format: thousand=',', decimal='.'\n // Remove thousand separators (commas) and keep dots as decimal\n parseValue = cleanValue.replace(/,/g, '');\n }\n\n numericValue = parseFloat(parseValue) || 0;\n } else {\n numericValue = value;\n }\n }\n\n // Force positive values only\n if (numericValue < 0) {\n numericValue = 0;\n }\n\n // Apply length constraints with configurable decimal places\n const applyLengthConstraints = (num: number): number => {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Limit integer part length\n if (integerPart && integerPart.length > maxIntegerLength) {\n const limitedInteger = integerPart.slice(0, maxIntegerLength);\n const limitedDecimal = decimalPart ? decimalPart.slice(0, maxDecimalLength) : '';\n return parseFloat(limitedDecimal ? `${limitedInteger}.${limitedDecimal}` : limitedInteger);\n }\n\n // Limit decimal part to maxDecimalLength\n if (decimalPart && decimalPart.length > maxDecimalLength) {\n const limitedDecimal = decimalPart.slice(0, maxDecimalLength);\n return parseFloat(`${integerPart}.${limitedDecimal}`);\n }\n\n return num;\n };\n\n numericValue = applyLengthConstraints(numericValue);\n\n // Apply rounding if isRound option is enabled\n if (isRound) {\n numericValue = Math.round(numericValue);\n }\n\n // Format number with thousand separators\n const formatNumber = (num: number): string => {\n if (thousandSeparator === false) {\n if (isRound) {\n return num.toFixed(fixedDecimalScale ? Math.min(decimalScale, maxDecimalLength) : 0);\n } else {\n // When not rounding, format to specified decimal places without using toFixed\n if (fixedDecimalScale && decimalScale > 0) {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n const targetDecimals = Math.min(decimalScale, maxDecimalLength);\n const currentDecimals = decimalPart || '';\n\n // Truncate or pad to exact decimal places\n const formattedDecimals = currentDecimals\n .slice(0, targetDecimals)\n .padEnd(targetDecimals, '0');\n return `${integerPart}.${formattedDecimals}`;\n }\n return num.toString();\n }\n }\n\n // Format with thousand separators\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Format integer part with thousand separators\n let formattedInteger = integerPart || '0';\n if (thousandSeparator && formattedInteger.length > 3) {\n const separator = typeof thousandSeparator === 'string' ? thousandSeparator : ',';\n formattedInteger = formattedInteger.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\n }\n\n // Format decimal part\n let formattedDecimal = '';\n if (decimalPart || fixedDecimalScale) {\n const maxDecimals = Math.min(decimalScale, maxDecimalLength);\n const decimals = decimalPart || '';\n\n if (fixedDecimalScale) {\n if (isRound) {\n // When rounding, use toFixed-like behavior but respect original separators\n const rounded = Math.round(num * Math.pow(10, maxDecimals)) / Math.pow(10, maxDecimals);\n const roundedStr = rounded.toString();\n const [, roundedDecimal] = roundedStr.split('.');\n formattedDecimal = (roundedDecimal || '').padEnd(maxDecimals, '0').slice(0, maxDecimals);\n } else {\n // When not rounding, truncate to specified decimal places without padding zeros unless needed\n formattedDecimal = decimals.slice(0, maxDecimals);\n // Pad with zeros only if we want fixed decimal scale\n if (maxDecimals > 0) {\n formattedDecimal = formattedDecimal.padEnd(maxDecimals, '0');\n }\n }\n\n // Only show decimal part if it's not all zeros (smart decimal display)\n if (formattedDecimal && !formattedDecimal.match(/^0+$/)) {\n formattedDecimal = decimalSeparator + formattedDecimal;\n } else if (maxDecimals > 0 && (decimals.length > 0 || !isRound)) {\n // Show decimal part if there are actual decimals or if we're not rounding\n formattedDecimal = decimalSeparator + formattedDecimal;\n } else {\n formattedDecimal = '';\n }\n } else {\n // Not fixed decimal scale - only show existing decimal digits\n formattedDecimal = decimals.slice(0, maxDecimals);\n if (formattedDecimal) {\n formattedDecimal = decimalSeparator + formattedDecimal;\n }\n }\n }\n\n return formattedInteger + formattedDecimal;\n };\n\n const formatted = formatNumber(numericValue);\n\n // Add currency symbol\n const formattedWithCurrency =\n currencyPosition === 'prefix' ? `${currency}${formatted}` : `${formatted}${currency}`;\n\n // Generate Vietnamese text\n let vietnameseText = '';\n if (showVietnameseText && numericValue > 0) {\n try {\n const config = new ReadingConfig();\n if (vietnameseTextUnit) {\n config.unit = [vietnameseTextUnit];\n }\n\n const result = doReadNumber(config, numericValue.toString());\n vietnameseText = result.charAt(0).toUpperCase() + result.slice(1);\n } catch (error) {\n if (!(error instanceof InvalidFormatError || error instanceof InvalidNumberError)) {\n console.warn('Error generating Vietnamese text:', error);\n }\n vietnameseText = '';\n }\n }\n\n // Generate shortened currency text\n let shortenedCurrencyText = '';\n if (shortenedCurrencyDisplay && numericValue > 0) {\n try {\n let shortValue: number = 0;\n let unit: string = '';\n\n if (numericValue >= 1000000000) {\n // >= 1 tỷ\n shortValue = numericValue / 1000000000;\n unit = 'tỷ';\n } else if (numericValue >= 1000000) {\n // >= 1 triệu\n shortValue = numericValue / 1000000;\n unit = 'tr';\n } else if (numericValue >= 1000) {\n // >= 1 nghìn\n shortValue = numericValue / 1000;\n unit = 'k';\n } else {\n // < 1 nghìn - use original formatting\n shortenedCurrencyText = formatted;\n unit = '';\n }\n\n if (unit) {\n // For shortened currency, we want Vietnamese standard format:\n // - Comma for thousands separator (12,312)\n // - Dot for decimal separator (.31)\n // - Result: \"12,312.31 tỷ\"\n\n // Create a custom formatter for shortened currency that always uses Vietnamese format\n const formatShortened = (num: number): string => {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Format integer part with comma as thousand separator\n let formattedInteger = integerPart || '0';\n if (formattedInteger.length > 3) {\n formattedInteger = formattedInteger.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n\n // Format decimal part with dot as decimal separator\n let formattedDecimal = '';\n if (decimalPart) {\n const maxDecimals = Math.min(decimalScale, 2); // Max 2 decimal places for shortened\n let decimals = decimalPart.slice(0, maxDecimals);\n\n // Remove trailing zeros for clean display\n decimals = decimals.replace(/0+$/, '');\n\n if (decimals) {\n formattedDecimal = '.' + decimals;\n }\n }\n\n return formattedInteger + formattedDecimal;\n };\n\n const displayValue = formatShortened(shortValue);\n shortenedCurrencyText = `${displayValue} ${unit}`;\n }\n } catch (error) {\n console.warn('Error generating shortened currency text:', error);\n shortenedCurrencyText = '';\n }\n }\n\n // Determine display text\n const displayText =\n shortenedCurrencyDisplay && shortenedCurrencyText\n ? shortenedCurrencyText\n : showVietnameseText && vietnameseText\n ? vietnameseText\n : formattedWithCurrency;\n\n return {\n value: numericValue,\n formatted,\n formattedWithCurrency,\n vietnameseText,\n shortenedCurrencyText,\n displayText,\n };\n}\n"]}
@@ -1,185 +0,0 @@
1
- import { ReadingConfig, doReadNumber, InvalidFormatError, InvalidNumberError } from 'read-vietnamese-number';
2
-
3
- function formatCurrency(value, options = {}) {
4
- const {
5
- thousandSeparator = ",",
6
- decimalSeparator = ".",
7
- decimalScale = 2,
8
- fixedDecimalScale = false,
9
- currency = "\u0111",
10
- currencyPosition = "suffix",
11
- showVietnameseText = false,
12
- vietnameseTextUnit = "\u0111\u1ED3ng",
13
- maxIntegerLength = 14,
14
- maxDecimalLength = 6,
15
- shortenedCurrencyDisplay = false,
16
- isRound = false
17
- } = options;
18
- let numericValue = 0;
19
- if (value !== null && value !== void 0 && value !== "") {
20
- if (typeof value === "string") {
21
- const cleanValue = value.replace(/[^\d,.]/g, "");
22
- let parseValue = cleanValue;
23
- if (decimalSeparator === "," && thousandSeparator === ".") {
24
- parseValue = cleanValue.replace(/,/g, ".");
25
- } else if (decimalSeparator === "." && thousandSeparator === ",") {
26
- parseValue = cleanValue.replace(/,/g, "");
27
- }
28
- numericValue = parseFloat(parseValue) || 0;
29
- } else {
30
- numericValue = value;
31
- }
32
- }
33
- if (numericValue < 0) {
34
- numericValue = 0;
35
- }
36
- const applyLengthConstraints = (num) => {
37
- const numStr = num.toString();
38
- const [integerPart, decimalPart] = numStr.split(".");
39
- if (integerPart && integerPart.length > maxIntegerLength) {
40
- const limitedInteger = integerPart.slice(0, maxIntegerLength);
41
- const limitedDecimal = decimalPart ? decimalPart.slice(0, maxDecimalLength) : "";
42
- return parseFloat(limitedDecimal ? `${limitedInteger}.${limitedDecimal}` : limitedInteger);
43
- }
44
- if (decimalPart && decimalPart.length > maxDecimalLength) {
45
- const limitedDecimal = decimalPart.slice(0, maxDecimalLength);
46
- return parseFloat(`${integerPart}.${limitedDecimal}`);
47
- }
48
- return num;
49
- };
50
- numericValue = applyLengthConstraints(numericValue);
51
- if (isRound) {
52
- numericValue = Math.round(numericValue);
53
- }
54
- const formatNumber = (num) => {
55
- if (thousandSeparator === false) {
56
- if (isRound) {
57
- return num.toFixed(fixedDecimalScale ? Math.min(decimalScale, maxDecimalLength) : 0);
58
- } else {
59
- if (fixedDecimalScale && decimalScale > 0) {
60
- const numStr2 = num.toString();
61
- const [integerPart2, decimalPart2] = numStr2.split(".");
62
- const targetDecimals = Math.min(decimalScale, maxDecimalLength);
63
- const currentDecimals = decimalPart2 || "";
64
- const formattedDecimals = currentDecimals.slice(0, targetDecimals).padEnd(targetDecimals, "0");
65
- return `${integerPart2}.${formattedDecimals}`;
66
- }
67
- return num.toString();
68
- }
69
- }
70
- const numStr = num.toString();
71
- const [integerPart, decimalPart] = numStr.split(".");
72
- let formattedInteger = integerPart || "0";
73
- if (thousandSeparator && formattedInteger.length > 3) {
74
- const separator = typeof thousandSeparator === "string" ? thousandSeparator : ",";
75
- formattedInteger = formattedInteger.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
76
- }
77
- let formattedDecimal = "";
78
- if (decimalPart || fixedDecimalScale) {
79
- const maxDecimals = Math.min(decimalScale, maxDecimalLength);
80
- const decimals = decimalPart || "";
81
- if (fixedDecimalScale) {
82
- if (isRound) {
83
- const rounded = Math.round(num * Math.pow(10, maxDecimals)) / Math.pow(10, maxDecimals);
84
- const roundedStr = rounded.toString();
85
- const [, roundedDecimal] = roundedStr.split(".");
86
- formattedDecimal = (roundedDecimal || "").padEnd(maxDecimals, "0").slice(0, maxDecimals);
87
- } else {
88
- formattedDecimal = decimals.slice(0, maxDecimals);
89
- if (maxDecimals > 0) {
90
- formattedDecimal = formattedDecimal.padEnd(maxDecimals, "0");
91
- }
92
- }
93
- if (formattedDecimal && !formattedDecimal.match(/^0+$/)) {
94
- formattedDecimal = decimalSeparator + formattedDecimal;
95
- } else if (maxDecimals > 0 && (decimals.length > 0 || !isRound)) {
96
- formattedDecimal = decimalSeparator + formattedDecimal;
97
- } else {
98
- formattedDecimal = "";
99
- }
100
- } else {
101
- formattedDecimal = decimals.slice(0, maxDecimals);
102
- if (formattedDecimal) {
103
- formattedDecimal = decimalSeparator + formattedDecimal;
104
- }
105
- }
106
- }
107
- return formattedInteger + formattedDecimal;
108
- };
109
- const formatted = formatNumber(numericValue);
110
- const formattedWithCurrency = currencyPosition === "prefix" ? `${currency}${formatted}` : `${formatted}${currency}`;
111
- let vietnameseText = "";
112
- if (showVietnameseText && numericValue > 0) {
113
- try {
114
- const config = new ReadingConfig();
115
- if (vietnameseTextUnit) {
116
- config.unit = [vietnameseTextUnit];
117
- }
118
- const result = doReadNumber(config, numericValue.toString());
119
- vietnameseText = result.charAt(0).toUpperCase() + result.slice(1);
120
- } catch (error) {
121
- if (!(error instanceof InvalidFormatError || error instanceof InvalidNumberError)) {
122
- console.warn("Error generating Vietnamese text:", error);
123
- }
124
- vietnameseText = "";
125
- }
126
- }
127
- let shortenedCurrencyText = "";
128
- if (shortenedCurrencyDisplay && numericValue > 0) {
129
- try {
130
- let shortValue = 0;
131
- let unit = "";
132
- if (numericValue >= 1e9) {
133
- shortValue = numericValue / 1e9;
134
- unit = "t\u1EF7";
135
- } else if (numericValue >= 1e6) {
136
- shortValue = numericValue / 1e6;
137
- unit = "tr";
138
- } else if (numericValue >= 1e3) {
139
- shortValue = numericValue / 1e3;
140
- unit = "k";
141
- } else {
142
- shortenedCurrencyText = formatted;
143
- unit = "";
144
- }
145
- if (unit) {
146
- const formatShortened = (num) => {
147
- const numStr = num.toString();
148
- const [integerPart, decimalPart] = numStr.split(".");
149
- let formattedInteger = integerPart || "0";
150
- if (formattedInteger.length > 3) {
151
- formattedInteger = formattedInteger.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
152
- }
153
- let formattedDecimal = "";
154
- if (decimalPart) {
155
- const maxDecimals = Math.min(decimalScale, 2);
156
- let decimals = decimalPart.slice(0, maxDecimals);
157
- decimals = decimals.replace(/0+$/, "");
158
- if (decimals) {
159
- formattedDecimal = "." + decimals;
160
- }
161
- }
162
- return formattedInteger + formattedDecimal;
163
- };
164
- const displayValue = formatShortened(shortValue);
165
- shortenedCurrencyText = `${displayValue} ${unit}`;
166
- }
167
- } catch (error) {
168
- console.warn("Error generating shortened currency text:", error);
169
- shortenedCurrencyText = "";
170
- }
171
- }
172
- const displayText = shortenedCurrencyDisplay && shortenedCurrencyText ? shortenedCurrencyText : showVietnameseText && vietnameseText ? vietnameseText : formattedWithCurrency;
173
- return {
174
- value: numericValue,
175
- formatted,
176
- formattedWithCurrency,
177
- vietnameseText,
178
- shortenedCurrencyText,
179
- displayText
180
- };
181
- }
182
-
183
- export { formatCurrency };
184
- //# sourceMappingURL=formatCurrency.mjs.map
185
- //# sourceMappingURL=formatCurrency.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/formatCurrency.ts"],"names":["numStr","integerPart","decimalPart"],"mappings":"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","file":"formatCurrency.mjs","sourcesContent":["import {\n doReadNumber,\n InvalidFormatError,\n InvalidNumberError,\n ReadingConfig,\n} from 'read-vietnamese-number';\n\nexport interface CurrencyFormatOptions {\n /**\n * Thousand separator character\n * @default ',' (International format)\n */\n thousandSeparator?: string | boolean;\n\n /**\n * Decimal separator character\n * @default '.' (International format)\n */\n decimalSeparator?: string;\n\n /**\n * Number of decimal places\n * @default 2\n */\n decimalScale?: number;\n\n /**\n * Whether to use fixed decimal scale\n * @default false\n */\n fixedDecimalScale?: boolean;\n\n /**\n * Allow negative numbers\n * @default false\n */\n allowNegative?: boolean;\n\n /**\n * Currency symbol\n * @default 'đ'\n */\n currency?: string;\n\n /**\n * Currency position\n * @default 'suffix'\n */\n currencyPosition?: 'prefix' | 'suffix';\n\n /**\n * Show Vietnamese text reading\n * @default false\n */\n showVietnameseText?: boolean;\n\n /**\n * Vietnamese text unit\n * @default 'đồng'\n */\n vietnameseTextUnit?: string;\n\n /**\n * Locale for formatting\n * @default 'vi-VN'\n */\n locale?: string;\n\n /**\n * Maximum length for integer part (before decimal)\n * @default 14\n */\n maxIntegerLength?: number;\n\n /**\n * Maximum length for decimal part (after decimal)\n * @default 6\n */\n maxDecimalLength?: number;\n\n /**\n * Show shortened currency display (k, tr, tỷ)\n * @default false\n */\n shortenedCurrencyDisplay?: boolean;\n\n /**\n * Whether to round the number to remove decimal places\n * @default false\n */\n isRound?: boolean;\n}\n\nexport interface CurrencyFormatResult {\n /**\n * Raw numeric value\n */\n value: number;\n\n /**\n * Formatted value with thousand separators\n */\n formatted: string;\n\n /**\n * Formatted value with currency symbol\n */\n formattedWithCurrency: string;\n\n /**\n * Vietnamese text reading\n */\n vietnameseText: string;\n\n /**\n * Shortened currency text (k, tr, tỷ)\n */\n shortenedCurrencyText: string;\n\n /**\n * Display text (formatted + currency or vietnamese text based on options)\n */\n displayText: string;\n}\n\n/**\n * Function to format currency values with Vietnamese text support\n * @param value - The numeric value to format\n * @param options - Formatting options\n * @returns Formatted currency result\n */\nexport function formatCurrency(\n value: string | number | null | undefined,\n options: CurrencyFormatOptions = {},\n): CurrencyFormatResult {\n const {\n thousandSeparator = ',',\n decimalSeparator = '.',\n decimalScale = 2,\n fixedDecimalScale = false,\n currency = 'đ',\n currencyPosition = 'suffix',\n showVietnameseText = false,\n vietnameseTextUnit = 'đồng',\n maxIntegerLength = 14,\n maxDecimalLength = 6,\n shortenedCurrencyDisplay = false,\n isRound = false,\n } = options;\n\n // Parse input value\n let numericValue = 0;\n if (value !== null && value !== undefined && value !== '') {\n if (typeof value === 'string') {\n // Only allow digits, comma, and dots\n const cleanValue = value.replace(/[^\\d,.]/g, '');\n\n // Handle different separator formats\n let parseValue = cleanValue;\n if (decimalSeparator === ',' && thousandSeparator === '.') {\n // Vietnamese format: thousand='.', decimal=','\n // Replace comma with dot for parsing (since parseFloat expects dot as decimal)\n parseValue = cleanValue.replace(/,/g, '.');\n } else if (decimalSeparator === '.' && thousandSeparator === ',') {\n // International format: thousand=',', decimal='.'\n // Remove thousand separators (commas) and keep dots as decimal\n parseValue = cleanValue.replace(/,/g, '');\n }\n\n numericValue = parseFloat(parseValue) || 0;\n } else {\n numericValue = value;\n }\n }\n\n // Force positive values only\n if (numericValue < 0) {\n numericValue = 0;\n }\n\n // Apply length constraints with configurable decimal places\n const applyLengthConstraints = (num: number): number => {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Limit integer part length\n if (integerPart && integerPart.length > maxIntegerLength) {\n const limitedInteger = integerPart.slice(0, maxIntegerLength);\n const limitedDecimal = decimalPart ? decimalPart.slice(0, maxDecimalLength) : '';\n return parseFloat(limitedDecimal ? `${limitedInteger}.${limitedDecimal}` : limitedInteger);\n }\n\n // Limit decimal part to maxDecimalLength\n if (decimalPart && decimalPart.length > maxDecimalLength) {\n const limitedDecimal = decimalPart.slice(0, maxDecimalLength);\n return parseFloat(`${integerPart}.${limitedDecimal}`);\n }\n\n return num;\n };\n\n numericValue = applyLengthConstraints(numericValue);\n\n // Apply rounding if isRound option is enabled\n if (isRound) {\n numericValue = Math.round(numericValue);\n }\n\n // Format number with thousand separators\n const formatNumber = (num: number): string => {\n if (thousandSeparator === false) {\n if (isRound) {\n return num.toFixed(fixedDecimalScale ? Math.min(decimalScale, maxDecimalLength) : 0);\n } else {\n // When not rounding, format to specified decimal places without using toFixed\n if (fixedDecimalScale && decimalScale > 0) {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n const targetDecimals = Math.min(decimalScale, maxDecimalLength);\n const currentDecimals = decimalPart || '';\n\n // Truncate or pad to exact decimal places\n const formattedDecimals = currentDecimals\n .slice(0, targetDecimals)\n .padEnd(targetDecimals, '0');\n return `${integerPart}.${formattedDecimals}`;\n }\n return num.toString();\n }\n }\n\n // Format with thousand separators\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Format integer part with thousand separators\n let formattedInteger = integerPart || '0';\n if (thousandSeparator && formattedInteger.length > 3) {\n const separator = typeof thousandSeparator === 'string' ? thousandSeparator : ',';\n formattedInteger = formattedInteger.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator);\n }\n\n // Format decimal part\n let formattedDecimal = '';\n if (decimalPart || fixedDecimalScale) {\n const maxDecimals = Math.min(decimalScale, maxDecimalLength);\n const decimals = decimalPart || '';\n\n if (fixedDecimalScale) {\n if (isRound) {\n // When rounding, use toFixed-like behavior but respect original separators\n const rounded = Math.round(num * Math.pow(10, maxDecimals)) / Math.pow(10, maxDecimals);\n const roundedStr = rounded.toString();\n const [, roundedDecimal] = roundedStr.split('.');\n formattedDecimal = (roundedDecimal || '').padEnd(maxDecimals, '0').slice(0, maxDecimals);\n } else {\n // When not rounding, truncate to specified decimal places without padding zeros unless needed\n formattedDecimal = decimals.slice(0, maxDecimals);\n // Pad with zeros only if we want fixed decimal scale\n if (maxDecimals > 0) {\n formattedDecimal = formattedDecimal.padEnd(maxDecimals, '0');\n }\n }\n\n // Only show decimal part if it's not all zeros (smart decimal display)\n if (formattedDecimal && !formattedDecimal.match(/^0+$/)) {\n formattedDecimal = decimalSeparator + formattedDecimal;\n } else if (maxDecimals > 0 && (decimals.length > 0 || !isRound)) {\n // Show decimal part if there are actual decimals or if we're not rounding\n formattedDecimal = decimalSeparator + formattedDecimal;\n } else {\n formattedDecimal = '';\n }\n } else {\n // Not fixed decimal scale - only show existing decimal digits\n formattedDecimal = decimals.slice(0, maxDecimals);\n if (formattedDecimal) {\n formattedDecimal = decimalSeparator + formattedDecimal;\n }\n }\n }\n\n return formattedInteger + formattedDecimal;\n };\n\n const formatted = formatNumber(numericValue);\n\n // Add currency symbol\n const formattedWithCurrency =\n currencyPosition === 'prefix' ? `${currency}${formatted}` : `${formatted}${currency}`;\n\n // Generate Vietnamese text\n let vietnameseText = '';\n if (showVietnameseText && numericValue > 0) {\n try {\n const config = new ReadingConfig();\n if (vietnameseTextUnit) {\n config.unit = [vietnameseTextUnit];\n }\n\n const result = doReadNumber(config, numericValue.toString());\n vietnameseText = result.charAt(0).toUpperCase() + result.slice(1);\n } catch (error) {\n if (!(error instanceof InvalidFormatError || error instanceof InvalidNumberError)) {\n console.warn('Error generating Vietnamese text:', error);\n }\n vietnameseText = '';\n }\n }\n\n // Generate shortened currency text\n let shortenedCurrencyText = '';\n if (shortenedCurrencyDisplay && numericValue > 0) {\n try {\n let shortValue: number = 0;\n let unit: string = '';\n\n if (numericValue >= 1000000000) {\n // >= 1 tỷ\n shortValue = numericValue / 1000000000;\n unit = 'tỷ';\n } else if (numericValue >= 1000000) {\n // >= 1 triệu\n shortValue = numericValue / 1000000;\n unit = 'tr';\n } else if (numericValue >= 1000) {\n // >= 1 nghìn\n shortValue = numericValue / 1000;\n unit = 'k';\n } else {\n // < 1 nghìn - use original formatting\n shortenedCurrencyText = formatted;\n unit = '';\n }\n\n if (unit) {\n // For shortened currency, we want Vietnamese standard format:\n // - Comma for thousands separator (12,312)\n // - Dot for decimal separator (.31)\n // - Result: \"12,312.31 tỷ\"\n\n // Create a custom formatter for shortened currency that always uses Vietnamese format\n const formatShortened = (num: number): string => {\n const numStr = num.toString();\n const [integerPart, decimalPart] = numStr.split('.');\n\n // Format integer part with comma as thousand separator\n let formattedInteger = integerPart || '0';\n if (formattedInteger.length > 3) {\n formattedInteger = formattedInteger.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n\n // Format decimal part with dot as decimal separator\n let formattedDecimal = '';\n if (decimalPart) {\n const maxDecimals = Math.min(decimalScale, 2); // Max 2 decimal places for shortened\n let decimals = decimalPart.slice(0, maxDecimals);\n\n // Remove trailing zeros for clean display\n decimals = decimals.replace(/0+$/, '');\n\n if (decimals) {\n formattedDecimal = '.' + decimals;\n }\n }\n\n return formattedInteger + formattedDecimal;\n };\n\n const displayValue = formatShortened(shortValue);\n shortenedCurrencyText = `${displayValue} ${unit}`;\n }\n } catch (error) {\n console.warn('Error generating shortened currency text:', error);\n shortenedCurrencyText = '';\n }\n }\n\n // Determine display text\n const displayText =\n shortenedCurrencyDisplay && shortenedCurrencyText\n ? shortenedCurrencyText\n : showVietnameseText && vietnameseText\n ? vietnameseText\n : formattedWithCurrency;\n\n return {\n value: numericValue,\n formatted,\n formattedWithCurrency,\n vietnameseText,\n shortenedCurrencyText,\n displayText,\n };\n}\n"]}
@@ -1,171 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
-
5
- function debounce(func, wait) {
6
- let timeout;
7
- let lastPromise;
8
- const debounced = ((...args) => {
9
- clearTimeout(timeout);
10
- lastPromise = new Promise((resolve, reject) => {
11
- timeout = setTimeout(async () => {
12
- try {
13
- const result = await func(...args);
14
- resolve(result);
15
- } catch (error) {
16
- reject(error);
17
- }
18
- }, wait);
19
- });
20
- return lastPromise;
21
- });
22
- debounced.cancel = () => {
23
- clearTimeout(timeout);
24
- timeout = void 0;
25
- lastPromise = void 0;
26
- };
27
- return debounced;
28
- }
29
- function throttle(func, wait) {
30
- let lastCallTime = 0;
31
- let timeoutId;
32
- return ((...args) => {
33
- const now = Date.now();
34
- const remainingTime = wait - (now - lastCallTime);
35
- if (remainingTime <= 0) {
36
- if (timeoutId) {
37
- clearTimeout(timeoutId);
38
- timeoutId = void 0;
39
- }
40
- lastCallTime = now;
41
- func(...args);
42
- } else if (!timeoutId) {
43
- timeoutId = setTimeout(() => {
44
- lastCallTime = Date.now();
45
- timeoutId = void 0;
46
- func(...args);
47
- }, remainingTime);
48
- }
49
- });
50
- }
51
- function isEmpty(value) {
52
- if (value == null) return true;
53
- if (typeof value === "object") {
54
- return Object.keys(value).length === 0;
55
- }
56
- if (typeof value === "string") return value.trim().length === 0;
57
- if (Array.isArray(value)) return value.length === 0;
58
- return false;
59
- }
60
- function round(value, precision = 0) {
61
- const multiplier = Math.pow(10, precision);
62
- return Math.round(value * multiplier) / multiplier;
63
- }
64
- function isNaN(value) {
65
- return typeof value === "number" && Number.isNaN(value);
66
- }
67
- function isFunction(value) {
68
- return typeof value === "function";
69
- }
70
- function isArray(value) {
71
- return Array.isArray(value);
72
- }
73
- function isPlainObject(value) {
74
- if (typeof value !== "object" || value === null) return false;
75
- const proto = Object.getPrototypeOf(value);
76
- return proto === null || proto === Object.prototype;
77
- }
78
- function isNil(value) {
79
- return value == null;
80
- }
81
- function transform(object, iteratee, accumulator) {
82
- const result = accumulator !== void 0 ? accumulator : Array.isArray(object) ? [] : {};
83
- if (Array.isArray(object)) {
84
- object.forEach((value, index) => {
85
- iteratee(result, value, index, object);
86
- });
87
- } else {
88
- Object.keys(object).forEach((key) => {
89
- iteratee(result, object[key], key, object);
90
- });
91
- }
92
- return result;
93
- }
94
- function sortBy(array, iteratee) {
95
- const getValueByPath = (obj, path) => {
96
- return path.split(".").reduce((acc, part) => acc?.[part], obj);
97
- };
98
- const getValue = (item) => {
99
- if (typeof iteratee === "function") {
100
- return iteratee(item);
101
- }
102
- if (typeof iteratee === "string") {
103
- return getValueByPath(item, iteratee);
104
- }
105
- if (Array.isArray(iteratee)) {
106
- return iteratee.map((path) => getValueByPath(item, path));
107
- }
108
- return item;
109
- };
110
- return [...array].sort((a, b) => {
111
- const aVal = getValue(a);
112
- const bVal = getValue(b);
113
- if (Array.isArray(aVal) && Array.isArray(bVal)) {
114
- for (let i = 0; i < Math.min(aVal.length, bVal.length); i++) {
115
- if (aVal[i] < bVal[i]) return -1;
116
- if (aVal[i] > bVal[i]) return 1;
117
- }
118
- return 0;
119
- }
120
- if (aVal < bVal) return -1;
121
- if (aVal > bVal) return 1;
122
- return 0;
123
- });
124
- }
125
- function useCallbackRef(callback) {
126
- const callbackRef = react.useRef(callback);
127
- react.useEffect(() => {
128
- callbackRef.current = callback;
129
- });
130
- return react.useMemo(() => ((...args) => callbackRef.current?.(...args)), []);
131
- }
132
- const useResizeObserver = ({
133
- callbackFn,
134
- targetRef
135
- }) => {
136
- const _targetRef = react.useRef();
137
- const handleObserver = react.useCallback(
138
- (entries) => {
139
- callbackFn(entries);
140
- },
141
- [callbackFn]
142
- );
143
- react.useEffect(() => {
144
- const targetObj = _targetRef.current || targetRef?.current;
145
- if (!targetObj) return;
146
- const observer = new ResizeObserver(handleObserver);
147
- observer.observe(targetObj);
148
- return () => {
149
- if (targetObj) {
150
- observer.unobserve(targetObj);
151
- }
152
- };
153
- }, [handleObserver, targetRef]);
154
- return _targetRef;
155
- };
156
-
157
- exports.debounce = debounce;
158
- exports.isArray = isArray;
159
- exports.isEmpty = isEmpty;
160
- exports.isFunction = isFunction;
161
- exports.isNaN = isNaN;
162
- exports.isNil = isNil;
163
- exports.isPlainObject = isPlainObject;
164
- exports.round = round;
165
- exports.sortBy = sortBy;
166
- exports.throttle = throttle;
167
- exports.transform = transform;
168
- exports.useCallbackRef = useCallbackRef;
169
- exports.useResizeObserver = useResizeObserver;
170
- //# sourceMappingURL=helpers.js.map
171
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/helpers.ts"],"names":["useRef","useEffect","useMemo","useCallback"],"mappings":"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","file":"helpers.js","sourcesContent":["'use client';\n\n/**\n * Performance utility functions for throttling and debouncing\n */\n\nimport { useEffect, useMemo, useRef, useCallback, MutableRefObject } from 'react';\n\n/**\n * Debounce function for limiting function calls\n * Supports both sync and async functions\n * @param func - The function to debounce\n * @param wait - The number of milliseconds to delay\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): ((...args: Parameters<T>) => ReturnType<T> extends Promise<any> ? ReturnType<T> : void) & {\n cancel: () => void;\n} {\n let timeout: NodeJS.Timeout | undefined;\n let lastPromise: Promise<any> | undefined;\n\n const debounced = ((...args: any[]) => {\n clearTimeout(timeout);\n\n // Create a new promise that will be resolved/rejected when debounce completes\n lastPromise = new Promise((resolve, reject) => {\n timeout = setTimeout(async () => {\n try {\n const result = await func(...args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, wait);\n });\n\n return lastPromise;\n }) as any;\n\n debounced.cancel = () => {\n clearTimeout(timeout);\n timeout = undefined;\n lastPromise = undefined;\n };\n\n return debounced;\n}\n\n/**\n * Throttle function for limiting function calls\n * @param func - The function to throttle\n * @param wait - The number of milliseconds to wait between calls\n * @returns Throttled function\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, wait: number): T {\n let lastCallTime = 0;\n let timeoutId: NodeJS.Timeout | undefined;\n\n return ((...args: any[]) => {\n const now = Date.now();\n const remainingTime = wait - (now - lastCallTime);\n\n if (remainingTime <= 0) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n lastCallTime = now;\n func(...args);\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCallTime = Date.now();\n timeoutId = undefined;\n func(...args);\n }, remainingTime);\n }\n }) as T;\n}\n\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true; // Handles null and undefined\n if (typeof value === 'object') {\n // Check for arrays or objects\n return Object.keys(value as object).length === 0;\n }\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n return false;\n}\n\n/**\n * Round number to specified precision\n */\nexport function round(value: number, precision: number = 0): number {\n const multiplier = Math.pow(10, precision);\n return Math.round(value * multiplier) / multiplier;\n}\n\n/**\n * Check if value is NaN\n */\nexport function isNaN(value: unknown): boolean {\n return typeof value === 'number' && Number.isNaN(value);\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n return Array.isArray(value);\n}\n\n/**\n * Check if value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, any> {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value == null;\n}\n\n/**\n * Transform object/array with custom iterator\n */\nexport function transform<T extends Record<string, any> | any[], R>(\n object: T,\n iteratee: (result: R, value: any, key: string | number, collection: T) => void,\n accumulator?: R,\n): R {\n const result = (accumulator !== undefined ? accumulator : Array.isArray(object) ? [] : {}) as R;\n\n if (Array.isArray(object)) {\n object.forEach((value, index) => {\n iteratee(result, value, index, object);\n });\n } else {\n Object.keys(object).forEach((key) => {\n iteratee(result, object[key], key, object);\n });\n }\n\n return result;\n}\n\n/**\n * Sort array by iteratee\n */\nexport function sortBy<T>(array: T[], iteratee: ((item: T) => any) | string | string[]): T[] {\n const getValueByPath = (obj: any, path: string): any => {\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\n };\n\n const getValue = (item: T): any => {\n if (typeof iteratee === 'function') {\n return iteratee(item);\n }\n if (typeof iteratee === 'string') {\n return getValueByPath(item, iteratee);\n }\n if (Array.isArray(iteratee)) {\n return iteratee.map((path) => getValueByPath(item, path));\n }\n return item;\n };\n\n return [...array].sort((a, b) => {\n const aVal = getValue(a);\n const bVal = getValue(b);\n\n if (Array.isArray(aVal) && Array.isArray(bVal)) {\n for (let i = 0; i < Math.min(aVal.length, bVal.length); i++) {\n if (aVal[i] < bVal[i]) return -1;\n if (aVal[i] > bVal[i]) return 1;\n }\n return 0;\n }\n\n if (aVal < bVal) return -1;\n if (aVal > bVal) return 1;\n return 0;\n });\n}\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nexport function useCallbackRef<T extends (...args: any[]) => any>(callback: T | undefined): T {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);\n}\n\nexport const useResizeObserver = ({\n callbackFn,\n targetRef,\n}: {\n callbackFn: (entries: ResizeObserverEntry[]) => void;\n targetRef?: MutableRefObject<any>;\n}) => {\n const _targetRef = useRef<any>();\n\n const handleObserver = useCallback(\n (entries: ResizeObserverEntry[]) => {\n callbackFn(entries);\n },\n [callbackFn],\n );\n\n useEffect(() => {\n const targetObj = _targetRef.current || targetRef?.current;\n\n if (!targetObj) return;\n const observer = new ResizeObserver(handleObserver);\n observer.observe(targetObj);\n return () => {\n if (targetObj) {\n observer.unobserve(targetObj);\n }\n };\n }, [handleObserver, targetRef]);\n\n return _targetRef;\n};\n"]}