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.
- package/dist/common/interactive/list.d.ts +1 -1
- package/dist/common/interactive/select/variants.d.ts +1 -1
- package/dist/components/alert-dialog.d.ts +2 -2
- package/dist/components/badge.d.ts +3 -3
- package/dist/components/button.d.ts +4 -4
- package/dist/components/chip.d.ts +2 -2
- package/dist/components/command.d.ts +7 -7
- package/dist/components/dialog.d.ts +2 -2
- package/dist/components/input-otp.d.ts +2 -2
- package/dist/components/resizable.d.ts +1 -1
- package/dist/components/sidebar.d.ts +1 -1
- package/dist/components/spinner.d.ts +2 -2
- package/dist/components/stepper.d.ts +3 -3
- package/dist/components/toggle-group.d.ts +2 -2
- package/dist/components/toggle.d.ts +2 -2
- package/dist/index.css +43 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8189 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7846 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +34 -2
- package/dist/assets/Animation/index.js +0 -180
- package/dist/assets/Animation/index.js.map +0 -1
- package/dist/assets/Animation/index.mjs +0 -79
- package/dist/assets/Animation/index.mjs.map +0 -1
- package/dist/assets/Icon/index.js +0 -2102
- package/dist/assets/Icon/index.js.map +0 -1
- package/dist/assets/Icon/index.mjs +0 -421
- package/dist/assets/Icon/index.mjs.map +0 -1
- package/dist/assets/Image/index.js +0 -755
- package/dist/assets/Image/index.js.map +0 -1
- package/dist/assets/Image/index.mjs +0 -150
- package/dist/assets/Image/index.mjs.map +0 -1
- package/dist/common/display/countdown.js +0 -68
- package/dist/common/display/countdown.js.map +0 -1
- package/dist/common/display/countdown.mjs +0 -46
- package/dist/common/display/countdown.mjs.map +0 -1
- package/dist/common/display/display-field-group.js +0 -91
- package/dist/common/display/display-field-group.js.map +0 -1
- package/dist/common/display/display-field-group.mjs +0 -89
- package/dist/common/display/display-field-group.mjs.map +0 -1
- package/dist/common/display/display-field.js +0 -46
- package/dist/common/display/display-field.js.map +0 -1
- package/dist/common/display/display-field.mjs +0 -40
- package/dist/common/display/display-field.mjs.map +0 -1
- package/dist/common/display/display-html-string.js +0 -52
- package/dist/common/display/display-html-string.js.map +0 -1
- package/dist/common/display/display-html-string.mjs +0 -30
- package/dist/common/display/display-html-string.mjs.map +0 -1
- package/dist/common/display/index.js +0 -59
- package/dist/common/display/index.js.map +0 -1
- package/dist/common/display/index.mjs +0 -10
- package/dist/common/display/index.mjs.map +0 -1
- package/dist/common/display/page-breadcrumb.js +0 -43
- package/dist/common/display/page-breadcrumb.js.map +0 -1
- package/dist/common/display/page-breadcrumb.mjs +0 -37
- package/dist/common/display/page-breadcrumb.mjs.map +0 -1
- package/dist/common/display/page-v2.js +0 -58
- package/dist/common/display/page-v2.js.map +0 -1
- package/dist/common/display/page-v2.mjs +0 -20
- package/dist/common/display/page-v2.mjs.map +0 -1
- package/dist/common/display/page.js +0 -155
- package/dist/common/display/page.js.map +0 -1
- package/dist/common/display/page.mjs +0 -138
- package/dist/common/display/page.mjs.map +0 -1
- package/dist/common/display/score-meter.js +0 -161
- package/dist/common/display/score-meter.js.map +0 -1
- package/dist/common/display/score-meter.mjs +0 -140
- package/dist/common/display/score-meter.mjs.map +0 -1
- package/dist/common/display/sidebar/app-sidebar.js +0 -114
- package/dist/common/display/sidebar/app-sidebar.js.map +0 -1
- package/dist/common/display/sidebar/app-sidebar.mjs +0 -92
- package/dist/common/display/sidebar/app-sidebar.mjs.map +0 -1
- package/dist/common/display/sidebar/index.js +0 -89
- package/dist/common/display/sidebar/index.js.map +0 -1
- package/dist/common/display/sidebar/index.mjs +0 -81
- package/dist/common/display/sidebar/index.mjs.map +0 -1
- package/dist/common/display/sidebar/nav-main.js +0 -406
- package/dist/common/display/sidebar/nav-main.js.map +0 -1
- package/dist/common/display/sidebar/nav-main.mjs +0 -400
- package/dist/common/display/sidebar/nav-main.mjs.map +0 -1
- package/dist/common/display/sidebar/sidebar-sheet.js +0 -140
- package/dist/common/display/sidebar/sidebar-sheet.js.map +0 -1
- package/dist/common/display/sidebar/sidebar-sheet.mjs +0 -118
- package/dist/common/display/sidebar/sidebar-sheet.mjs.map +0 -1
- package/dist/common/display/sidebar/types.js +0 -4
- package/dist/common/display/sidebar/types.js.map +0 -1
- package/dist/common/display/sidebar/types.mjs +0 -3
- package/dist/common/display/sidebar/types.mjs.map +0 -1
- package/dist/common/display/status-state.js +0 -97
- package/dist/common/display/status-state.js.map +0 -1
- package/dist/common/display/status-state.mjs +0 -88
- package/dist/common/display/status-state.mjs.map +0 -1
- package/dist/common/forms/auto-form.js +0 -101
- package/dist/common/forms/auto-form.js.map +0 -1
- package/dist/common/forms/auto-form.mjs +0 -78
- package/dist/common/forms/auto-form.mjs.map +0 -1
- package/dist/common/forms/form-field.js +0 -58
- package/dist/common/forms/form-field.js.map +0 -1
- package/dist/common/forms/form-field.mjs +0 -56
- package/dist/common/forms/form-field.mjs.map +0 -1
- package/dist/common/forms/form-input-field.js +0 -64
- package/dist/common/forms/form-input-field.js.map +0 -1
- package/dist/common/forms/form-input-field.mjs +0 -62
- package/dist/common/forms/form-input-field.mjs.map +0 -1
- package/dist/common/forms/index.js +0 -22
- package/dist/common/forms/index.js.map +0 -1
- package/dist/common/forms/index.mjs +0 -5
- package/dist/common/forms/index.mjs.map +0 -1
- package/dist/common/forms/switch-field.js +0 -106
- package/dist/common/forms/switch-field.js.map +0 -1
- package/dist/common/forms/switch-field.mjs +0 -104
- package/dist/common/forms/switch-field.mjs.map +0 -1
- package/dist/common/interactive/alert-dialog-wrapper.js +0 -141
- package/dist/common/interactive/alert-dialog-wrapper.js.map +0 -1
- package/dist/common/interactive/alert-dialog-wrapper.mjs +0 -119
- package/dist/common/interactive/alert-dialog-wrapper.mjs.map +0 -1
- package/dist/common/interactive/autocomplete.js +0 -178
- package/dist/common/interactive/autocomplete.js.map +0 -1
- package/dist/common/interactive/autocomplete.mjs +0 -157
- package/dist/common/interactive/autocomplete.mjs.map +0 -1
- package/dist/common/interactive/copy-tooltip.js +0 -152
- package/dist/common/interactive/copy-tooltip.js.map +0 -1
- package/dist/common/interactive/copy-tooltip.mjs +0 -143
- package/dist/common/interactive/copy-tooltip.mjs.map +0 -1
- package/dist/common/interactive/date-field.js +0 -303
- package/dist/common/interactive/date-field.js.map +0 -1
- package/dist/common/interactive/date-field.mjs +0 -281
- package/dist/common/interactive/date-field.mjs.map +0 -1
- package/dist/common/interactive/date-input/date-input.js +0 -68
- package/dist/common/interactive/date-input/date-input.js.map +0 -1
- package/dist/common/interactive/date-input/date-input.mjs +0 -62
- package/dist/common/interactive/date-input/date-input.mjs.map +0 -1
- package/dist/common/interactive/date-input/index.js +0 -17
- package/dist/common/interactive/date-input/index.js.map +0 -1
- package/dist/common/interactive/date-input/index.mjs +0 -4
- package/dist/common/interactive/date-input/index.mjs.map +0 -1
- package/dist/common/interactive/date-input/types.js +0 -4
- package/dist/common/interactive/date-input/types.js.map +0 -1
- package/dist/common/interactive/date-input/types.mjs +0 -3
- package/dist/common/interactive/date-input/types.mjs.map +0 -1
- package/dist/common/interactive/date-input/use-typed-date.js +0 -478
- package/dist/common/interactive/date-input/use-typed-date.js.map +0 -1
- package/dist/common/interactive/date-input/use-typed-date.mjs +0 -476
- package/dist/common/interactive/date-input/use-typed-date.mjs.map +0 -1
- package/dist/common/interactive/date-input/utils.js +0 -34
- package/dist/common/interactive/date-input/utils.js.map +0 -1
- package/dist/common/interactive/date-input/utils.mjs +0 -29
- package/dist/common/interactive/date-input/utils.mjs.map +0 -1
- package/dist/common/interactive/date-picker.js +0 -616
- package/dist/common/interactive/date-picker.js.map +0 -1
- package/dist/common/interactive/date-picker.mjs +0 -594
- package/dist/common/interactive/date-picker.mjs.map +0 -1
- package/dist/common/interactive/date-range-input/date-range-input.js +0 -82
- package/dist/common/interactive/date-range-input/date-range-input.js.map +0 -1
- package/dist/common/interactive/date-range-input/date-range-input.mjs +0 -76
- package/dist/common/interactive/date-range-input/date-range-input.mjs.map +0 -1
- package/dist/common/interactive/date-range-input/index.js +0 -12
- package/dist/common/interactive/date-range-input/index.js.map +0 -1
- package/dist/common/interactive/date-range-input/index.mjs +0 -3
- package/dist/common/interactive/date-range-input/index.mjs.map +0 -1
- package/dist/common/interactive/date-range-input/types.js +0 -4
- package/dist/common/interactive/date-range-input/types.js.map +0 -1
- package/dist/common/interactive/date-range-input/types.mjs +0 -3
- package/dist/common/interactive/date-range-input/types.mjs.map +0 -1
- package/dist/common/interactive/date-range-input/use-typed-date-range.js +0 -602
- package/dist/common/interactive/date-range-input/use-typed-date-range.js.map +0 -1
- package/dist/common/interactive/date-range-input/use-typed-date-range.mjs +0 -600
- package/dist/common/interactive/date-range-input/use-typed-date-range.mjs.map +0 -1
- package/dist/common/interactive/date-time-picker.js +0 -215
- package/dist/common/interactive/date-time-picker.js.map +0 -1
- package/dist/common/interactive/date-time-picker.mjs +0 -213
- package/dist/common/interactive/date-time-picker.mjs.map +0 -1
- package/dist/common/interactive/dialog-wrapper.js +0 -124
- package/dist/common/interactive/dialog-wrapper.js.map +0 -1
- package/dist/common/interactive/dialog-wrapper.mjs +0 -102
- package/dist/common/interactive/dialog-wrapper.mjs.map +0 -1
- package/dist/common/interactive/filter.js +0 -287
- package/dist/common/interactive/filter.js.map +0 -1
- package/dist/common/interactive/filter.mjs +0 -280
- package/dist/common/interactive/filter.mjs.map +0 -1
- package/dist/common/interactive/index.js +0 -235
- package/dist/common/interactive/index.js.map +0 -1
- package/dist/common/interactive/index.mjs +0 -24
- package/dist/common/interactive/index.mjs.map +0 -1
- package/dist/common/interactive/list.js +0 -160
- package/dist/common/interactive/list.js.map +0 -1
- package/dist/common/interactive/list.mjs +0 -134
- package/dist/common/interactive/list.mjs.map +0 -1
- package/dist/common/interactive/otp-dialog/index.js +0 -35
- package/dist/common/interactive/otp-dialog/index.js.map +0 -1
- package/dist/common/interactive/otp-dialog/index.mjs +0 -6
- package/dist/common/interactive/otp-dialog/index.mjs.map +0 -1
- package/dist/common/interactive/otp-dialog/otp-dialog.js +0 -325
- package/dist/common/interactive/otp-dialog/otp-dialog.js.map +0 -1
- package/dist/common/interactive/otp-dialog/otp-dialog.mjs +0 -303
- package/dist/common/interactive/otp-dialog/otp-dialog.mjs.map +0 -1
- package/dist/common/interactive/otp-dialog/reducer.js +0 -40
- package/dist/common/interactive/otp-dialog/reducer.js.map +0 -1
- package/dist/common/interactive/otp-dialog/reducer.mjs +0 -37
- package/dist/common/interactive/otp-dialog/reducer.mjs.map +0 -1
- package/dist/common/interactive/otp-dialog/types.js +0 -15
- package/dist/common/interactive/otp-dialog/types.js.map +0 -1
- package/dist/common/interactive/otp-dialog/types.mjs +0 -13
- package/dist/common/interactive/otp-dialog/types.mjs.map +0 -1
- package/dist/common/interactive/otp-dialog/utils.js +0 -24
- package/dist/common/interactive/otp-dialog/utils.js.map +0 -1
- package/dist/common/interactive/otp-dialog/utils.mjs +0 -21
- package/dist/common/interactive/otp-dialog/utils.mjs.map +0 -1
- package/dist/common/interactive/pagination/PaginationSkeleton.js +0 -51
- package/dist/common/interactive/pagination/PaginationSkeleton.js.map +0 -1
- package/dist/common/interactive/pagination/PaginationSkeleton.mjs +0 -49
- package/dist/common/interactive/pagination/PaginationSkeleton.mjs.map +0 -1
- package/dist/common/interactive/pagination/index.js +0 -235
- package/dist/common/interactive/pagination/index.js.map +0 -1
- package/dist/common/interactive/pagination/index.mjs +0 -223
- package/dist/common/interactive/pagination/index.mjs.map +0 -1
- package/dist/common/interactive/pagination/usePagination.js +0 -28
- package/dist/common/interactive/pagination/usePagination.js.map +0 -1
- package/dist/common/interactive/pagination/usePagination.mjs +0 -25
- package/dist/common/interactive/pagination/usePagination.mjs.map +0 -1
- package/dist/common/interactive/popover-wrapper.js +0 -138
- package/dist/common/interactive/popover-wrapper.js.map +0 -1
- package/dist/common/interactive/popover-wrapper.mjs +0 -116
- package/dist/common/interactive/popover-wrapper.mjs.map +0 -1
- package/dist/common/interactive/pressable.js +0 -84
- package/dist/common/interactive/pressable.js.map +0 -1
- package/dist/common/interactive/pressable.mjs +0 -62
- package/dist/common/interactive/pressable.mjs.map +0 -1
- package/dist/common/interactive/select/context.js +0 -38
- package/dist/common/interactive/select/context.js.map +0 -1
- package/dist/common/interactive/select/context.mjs +0 -14
- package/dist/common/interactive/select/context.mjs.map +0 -1
- package/dist/common/interactive/select/index.js +0 -123
- package/dist/common/interactive/select/index.js.map +0 -1
- package/dist/common/interactive/select/index.mjs +0 -18
- package/dist/common/interactive/select/index.mjs.map +0 -1
- package/dist/common/interactive/select/select-body.js +0 -89
- package/dist/common/interactive/select/select-body.js.map +0 -1
- package/dist/common/interactive/select/select-body.mjs +0 -67
- package/dist/common/interactive/select/select-body.mjs.map +0 -1
- package/dist/common/interactive/select/select-close.js +0 -38
- package/dist/common/interactive/select/select-close.js.map +0 -1
- package/dist/common/interactive/select/select-close.mjs +0 -16
- package/dist/common/interactive/select/select-close.mjs.map +0 -1
- package/dist/common/interactive/select/select-content-auto-layout.js +0 -221
- package/dist/common/interactive/select/select-content-auto-layout.js.map +0 -1
- package/dist/common/interactive/select/select-content-auto-layout.mjs +0 -199
- package/dist/common/interactive/select/select-content-auto-layout.mjs.map +0 -1
- package/dist/common/interactive/select/select-content-group-auto-layout.js +0 -411
- package/dist/common/interactive/select/select-content-group-auto-layout.js.map +0 -1
- package/dist/common/interactive/select/select-content-group-auto-layout.mjs +0 -389
- package/dist/common/interactive/select/select-content-group-auto-layout.mjs.map +0 -1
- package/dist/common/interactive/select/select-content.js +0 -187
- package/dist/common/interactive/select/select-content.js.map +0 -1
- package/dist/common/interactive/select/select-content.mjs +0 -165
- package/dist/common/interactive/select/select-content.mjs.map +0 -1
- package/dist/common/interactive/select/select-footer.js +0 -82
- package/dist/common/interactive/select/select-footer.js.map +0 -1
- package/dist/common/interactive/select/select-footer.mjs +0 -60
- package/dist/common/interactive/select/select-footer.mjs.map +0 -1
- package/dist/common/interactive/select/select-item.js +0 -214
- package/dist/common/interactive/select/select-item.js.map +0 -1
- package/dist/common/interactive/select/select-item.mjs +0 -191
- package/dist/common/interactive/select/select-item.mjs.map +0 -1
- package/dist/common/interactive/select/select-layout.js +0 -66
- package/dist/common/interactive/select/select-layout.js.map +0 -1
- package/dist/common/interactive/select/select-layout.mjs +0 -41
- package/dist/common/interactive/select/select-layout.mjs.map +0 -1
- package/dist/common/interactive/select/select-search.js +0 -55
- package/dist/common/interactive/select/select-search.js.map +0 -1
- package/dist/common/interactive/select/select-search.mjs +0 -33
- package/dist/common/interactive/select/select-search.mjs.map +0 -1
- package/dist/common/interactive/select/select-states.js +0 -57
- package/dist/common/interactive/select/select-states.js.map +0 -1
- package/dist/common/interactive/select/select-states.mjs +0 -34
- package/dist/common/interactive/select/select-states.mjs.map +0 -1
- package/dist/common/interactive/select/select-trigger.js +0 -310
- package/dist/common/interactive/select/select-trigger.js.map +0 -1
- package/dist/common/interactive/select/select-trigger.mjs +0 -286
- package/dist/common/interactive/select/select-trigger.mjs.map +0 -1
- package/dist/common/interactive/select/select-value.js +0 -52
- package/dist/common/interactive/select/select-value.js.map +0 -1
- package/dist/common/interactive/select/select-value.mjs +0 -30
- package/dist/common/interactive/select/select-value.mjs.map +0 -1
- package/dist/common/interactive/select/select.js +0 -184
- package/dist/common/interactive/select/select.js.map +0 -1
- package/dist/common/interactive/select/select.mjs +0 -162
- package/dist/common/interactive/select/select.mjs.map +0 -1
- package/dist/common/interactive/select/types.js +0 -4
- package/dist/common/interactive/select/types.js.map +0 -1
- package/dist/common/interactive/select/types.mjs +0 -3
- package/dist/common/interactive/select/types.mjs.map +0 -1
- package/dist/common/interactive/select/utils.js +0 -31
- package/dist/common/interactive/select/utils.js.map +0 -1
- package/dist/common/interactive/select/utils.mjs +0 -28
- package/dist/common/interactive/select/utils.mjs.map +0 -1
- package/dist/common/interactive/select/variants.js +0 -27
- package/dist/common/interactive/select/variants.js.map +0 -1
- package/dist/common/interactive/select/variants.mjs +0 -25
- package/dist/common/interactive/select/variants.mjs.map +0 -1
- package/dist/common/interactive/select-chip.js +0 -76
- package/dist/common/interactive/select-chip.js.map +0 -1
- package/dist/common/interactive/select-chip.mjs +0 -74
- package/dist/common/interactive/select-chip.mjs.map +0 -1
- package/dist/common/interactive/select-level.js +0 -236
- package/dist/common/interactive/select-level.js.map +0 -1
- package/dist/common/interactive/select-level.mjs +0 -230
- package/dist/common/interactive/select-level.mjs.map +0 -1
- package/dist/common/interactive/select-range.js +0 -211
- package/dist/common/interactive/select-range.js.map +0 -1
- package/dist/common/interactive/select-range.mjs +0 -209
- package/dist/common/interactive/select-range.mjs.map +0 -1
- package/dist/common/interactive/select-with-api.js +0 -767
- package/dist/common/interactive/select-with-api.js.map +0 -1
- package/dist/common/interactive/select-with-api.mjs +0 -758
- package/dist/common/interactive/select-with-api.mjs.map +0 -1
- package/dist/common/interactive/select.js +0 -15
- package/dist/common/interactive/select.js.map +0 -1
- package/dist/common/interactive/select.mjs +0 -4
- package/dist/common/interactive/select.mjs.map +0 -1
- package/dist/common/interactive/sheet-wrapper.js +0 -105
- package/dist/common/interactive/sheet-wrapper.js.map +0 -1
- package/dist/common/interactive/sheet-wrapper.mjs +0 -83
- package/dist/common/interactive/sheet-wrapper.mjs.map +0 -1
- package/dist/common/interactive/table/enhanced-table.js +0 -390
- package/dist/common/interactive/table/enhanced-table.js.map +0 -1
- package/dist/common/interactive/table/enhanced-table.mjs +0 -388
- package/dist/common/interactive/table/enhanced-table.mjs.map +0 -1
- package/dist/common/interactive/table/index.js +0 -83
- package/dist/common/interactive/table/index.js.map +0 -1
- package/dist/common/interactive/table/index.mjs +0 -68
- package/dist/common/interactive/table/index.mjs.map +0 -1
- package/dist/common/interactive/table/table-pagination.js +0 -12
- package/dist/common/interactive/table/table-pagination.js.map +0 -1
- package/dist/common/interactive/table/table-pagination.mjs +0 -10
- package/dist/common/interactive/table/table-pagination.mjs.map +0 -1
- package/dist/common/interactive/table/types.js +0 -4
- package/dist/common/interactive/table/types.js.map +0 -1
- package/dist/common/interactive/table/types.mjs +0 -3
- package/dist/common/interactive/table/types.mjs.map +0 -1
- package/dist/common/interactive/time-picker.js +0 -313
- package/dist/common/interactive/time-picker.js.map +0 -1
- package/dist/common/interactive/time-picker.mjs +0 -307
- package/dist/common/interactive/time-picker.mjs.map +0 -1
- package/dist/common/interactive/types.js +0 -4
- package/dist/common/interactive/types.js.map +0 -1
- package/dist/common/interactive/types.mjs +0 -3
- package/dist/common/interactive/types.mjs.map +0 -1
- package/dist/common/pages/page-404.js +0 -16
- package/dist/common/pages/page-404.js.map +0 -1
- package/dist/common/pages/page-404.mjs +0 -11
- package/dist/common/pages/page-404.mjs.map +0 -1
- package/dist/common/pages/page-500.js +0 -30
- package/dist/common/pages/page-500.js.map +0 -1
- package/dist/common/pages/page-500.mjs +0 -25
- package/dist/common/pages/page-500.mjs.map +0 -1
- package/dist/components/accordion.js +0 -65
- package/dist/components/accordion.js.map +0 -1
- package/dist/components/accordion.mjs +0 -39
- package/dist/components/accordion.mjs.map +0 -1
- package/dist/components/alert-dialog.js +0 -231
- package/dist/components/alert-dialog.js.map +0 -1
- package/dist/components/alert-dialog.mjs +0 -197
- package/dist/components/alert-dialog.mjs.map +0 -1
- package/dist/components/alert.js +0 -97
- package/dist/components/alert.js.map +0 -1
- package/dist/components/alert.mjs +0 -72
- package/dist/components/alert.mjs.map +0 -1
- package/dist/components/aspect-ratio.js +0 -29
- package/dist/components/aspect-ratio.js.map +0 -1
- package/dist/components/aspect-ratio.mjs +0 -7
- package/dist/components/aspect-ratio.mjs.map +0 -1
- package/dist/components/avatar.js +0 -64
- package/dist/components/avatar.js.map +0 -1
- package/dist/components/avatar.mjs +0 -39
- package/dist/components/avatar.mjs.map +0 -1
- package/dist/components/badge.js +0 -72
- package/dist/components/badge.js.map +0 -1
- package/dist/components/badge.mjs +0 -69
- package/dist/components/badge.mjs.map +0 -1
- package/dist/components/breadcrumb.js +0 -109
- package/dist/components/breadcrumb.js.map +0 -1
- package/dist/components/breadcrumb.mjs +0 -81
- package/dist/components/breadcrumb.mjs.map +0 -1
- package/dist/components/button.js +0 -250
- package/dist/components/button.js.map +0 -1
- package/dist/components/button.mjs +0 -226
- package/dist/components/button.mjs.map +0 -1
- package/dist/components/calendar.js +0 -681
- package/dist/components/calendar.js.map +0 -1
- package/dist/components/calendar.mjs +0 -659
- package/dist/components/calendar.mjs.map +0 -1
- package/dist/components/card.js +0 -98
- package/dist/components/card.js.map +0 -1
- package/dist/components/card.mjs +0 -71
- package/dist/components/card.mjs.map +0 -1
- package/dist/components/carousel.js +0 -237
- package/dist/components/carousel.js.map +0 -1
- package/dist/components/carousel.mjs +0 -208
- package/dist/components/carousel.mjs.map +0 -1
- package/dist/components/chart.js +0 -252
- package/dist/components/chart.js.map +0 -1
- package/dist/components/chart.mjs +0 -224
- package/dist/components/chart.mjs.map +0 -1
- package/dist/components/checkbox.js +0 -97
- package/dist/components/checkbox.js.map +0 -1
- package/dist/components/checkbox.mjs +0 -74
- package/dist/components/checkbox.mjs.map +0 -1
- package/dist/components/chip.js +0 -88
- package/dist/components/chip.js.map +0 -1
- package/dist/components/chip.mjs +0 -82
- package/dist/components/chip.mjs.map +0 -1
- package/dist/components/collapsible.js +0 -33
- package/dist/components/collapsible.js.map +0 -1
- package/dist/components/collapsible.mjs +0 -9
- package/dist/components/collapsible.mjs.map +0 -1
- package/dist/components/command.js +0 -125
- package/dist/components/command.js.map +0 -1
- package/dist/components/command.mjs +0 -95
- package/dist/components/command.mjs.map +0 -1
- package/dist/components/context-menu.js +0 -168
- package/dist/components/context-menu.js.map +0 -1
- package/dist/components/context-menu.mjs +0 -131
- package/dist/components/context-menu.mjs.map +0 -1
- package/dist/components/dialog.js +0 -192
- package/dist/components/dialog.js.map +0 -1
- package/dist/components/dialog.mjs +0 -159
- package/dist/components/dialog.mjs.map +0 -1
- package/dist/components/drawer.js +0 -98
- package/dist/components/drawer.js.map +0 -1
- package/dist/components/drawer.mjs +0 -67
- package/dist/components/drawer.mjs.map +0 -1
- package/dist/components/dropdown-menu.js +0 -163
- package/dist/components/dropdown-menu.js.map +0 -1
- package/dist/components/dropdown-menu.mjs +0 -126
- package/dist/components/dropdown-menu.mjs.map +0 -1
- package/dist/components/form.js +0 -123
- package/dist/components/form.js.map +0 -1
- package/dist/components/form.mjs +0 -94
- package/dist/components/form.mjs.map +0 -1
- package/dist/components/hover-card.js +0 -50
- package/dist/components/hover-card.js.map +0 -1
- package/dist/components/hover-card.mjs +0 -25
- package/dist/components/hover-card.mjs.map +0 -1
- package/dist/components/input-otp.js +0 -84
- package/dist/components/input-otp.js.map +0 -1
- package/dist/components/input-otp.mjs +0 -59
- package/dist/components/input-otp.mjs.map +0 -1
- package/dist/components/input.js +0 -858
- package/dist/components/input.js.map +0 -1
- package/dist/components/input.mjs +0 -831
- package/dist/components/input.mjs.map +0 -1
- package/dist/components/label.js +0 -38
- package/dist/components/label.js.map +0 -1
- package/dist/components/label.mjs +0 -15
- package/dist/components/label.mjs.map +0 -1
- package/dist/components/lottie.js +0 -59
- package/dist/components/lottie.js.map +0 -1
- package/dist/components/lottie.mjs +0 -49
- package/dist/components/lottie.mjs.map +0 -1
- package/dist/components/menubar.js +0 -195
- package/dist/components/menubar.js.map +0 -1
- package/dist/components/menubar.mjs +0 -157
- package/dist/components/menubar.mjs.map +0 -1
- package/dist/components/navigation-menu.js +0 -126
- package/dist/components/navigation-menu.js.map +0 -1
- package/dist/components/navigation-menu.mjs +0 -95
- package/dist/components/navigation-menu.mjs.map +0 -1
- package/dist/components/pagination.js +0 -112
- package/dist/components/pagination.js.map +0 -1
- package/dist/components/pagination.mjs +0 -84
- package/dist/components/pagination.mjs.map +0 -1
- package/dist/components/popover.js +0 -63
- package/dist/components/popover.js.map +0 -1
- package/dist/components/popover.mjs +0 -38
- package/dist/components/popover.mjs.map +0 -1
- package/dist/components/progress.js +0 -50
- package/dist/components/progress.js.map +0 -1
- package/dist/components/progress.mjs +0 -27
- package/dist/components/progress.mjs.map +0 -1
- package/dist/components/radio-group.js +0 -91
- package/dist/components/radio-group.js.map +0 -1
- package/dist/components/radio-group.mjs +0 -67
- package/dist/components/radio-group.mjs.map +0 -1
- package/dist/components/resizable.js +0 -59
- package/dist/components/resizable.js.map +0 -1
- package/dist/components/resizable.mjs +0 -35
- package/dist/components/resizable.mjs.map +0 -1
- package/dist/components/responsive-popover.js +0 -74
- package/dist/components/responsive-popover.js.map +0 -1
- package/dist/components/responsive-popover.mjs +0 -50
- package/dist/components/responsive-popover.mjs.map +0 -1
- package/dist/components/scroll-area.js +0 -63
- package/dist/components/scroll-area.js.map +0 -1
- package/dist/components/scroll-area.mjs +0 -39
- package/dist/components/scroll-area.mjs.map +0 -1
- package/dist/components/separator.js +0 -47
- package/dist/components/separator.js.map +0 -1
- package/dist/components/separator.mjs +0 -24
- package/dist/components/separator.mjs.map +0 -1
- package/dist/components/sheet.js +0 -239
- package/dist/components/sheet.js.map +0 -1
- package/dist/components/sheet.mjs +0 -206
- package/dist/components/sheet.mjs.map +0 -1
- package/dist/components/sidebar.js +0 -888
- package/dist/components/sidebar.js.map +0 -1
- package/dist/components/sidebar.mjs +0 -842
- package/dist/components/sidebar.mjs.map +0 -1
- package/dist/components/skeleton.js +0 -153
- package/dist/components/skeleton.js.map +0 -1
- package/dist/components/skeleton.mjs +0 -127
- package/dist/components/skeleton.mjs.map +0 -1
- package/dist/components/slider.js +0 -45
- package/dist/components/slider.js.map +0 -1
- package/dist/components/slider.mjs +0 -22
- package/dist/components/slider.mjs.map +0 -1
- package/dist/components/sonner.js +0 -76
- package/dist/components/sonner.js.map +0 -1
- package/dist/components/sonner.mjs +0 -71
- package/dist/components/sonner.mjs.map +0 -1
- package/dist/components/spinner.js +0 -59
- package/dist/components/spinner.js.map +0 -1
- package/dist/components/spinner.mjs +0 -36
- package/dist/components/spinner.mjs.map +0 -1
- package/dist/components/stepper.js +0 -726
- package/dist/components/stepper.js.map +0 -1
- package/dist/components/stepper.mjs +0 -702
- package/dist/components/stepper.mjs.map +0 -1
- package/dist/components/switch.js +0 -85
- package/dist/components/switch.js.map +0 -1
- package/dist/components/switch.mjs +0 -62
- package/dist/components/switch.mjs.map +0 -1
- package/dist/components/table.js +0 -91
- package/dist/components/table.js.map +0 -1
- package/dist/components/table.mjs +0 -62
- package/dist/components/table.mjs.map +0 -1
- package/dist/components/tabs.js +0 -287
- package/dist/components/tabs.js.map +0 -1
- package/dist/components/tabs.mjs +0 -261
- package/dist/components/tabs.mjs.map +0 -1
- package/dist/components/textarea.js +0 -200
- package/dist/components/textarea.js.map +0 -1
- package/dist/components/textarea.mjs +0 -174
- package/dist/components/textarea.mjs.map +0 -1
- package/dist/components/toggle-group.js +0 -67
- package/dist/components/toggle-group.js.map +0 -1
- package/dist/components/toggle-group.mjs +0 -43
- package/dist/components/toggle-group.mjs.map +0 -1
- package/dist/components/toggle.js +0 -63
- package/dist/components/toggle.js.map +0 -1
- package/dist/components/toggle.mjs +0 -39
- package/dist/components/toggle.mjs.map +0 -1
- package/dist/components/tooltip.js +0 -172
- package/dist/components/tooltip.js.map +0 -1
- package/dist/components/tooltip.mjs +0 -145
- package/dist/components/tooltip.mjs.map +0 -1
- package/dist/hooks/index.js +0 -27
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/index.mjs +0 -6
- package/dist/hooks/index.mjs.map +0 -1
- package/dist/hooks/useCopyToClipboard.js +0 -59
- package/dist/hooks/useCopyToClipboard.js.map +0 -1
- package/dist/hooks/useCopyToClipboard.mjs +0 -57
- package/dist/hooks/useCopyToClipboard.mjs.map +0 -1
- package/dist/hooks/useDevice.js +0 -20
- package/dist/hooks/useDevice.js.map +0 -1
- package/dist/hooks/useDevice.mjs +0 -14
- package/dist/hooks/useDevice.mjs.map +0 -1
- package/dist/hooks/useDialogTracking.js +0 -113
- package/dist/hooks/useDialogTracking.js.map +0 -1
- package/dist/hooks/useDialogTracking.mjs +0 -91
- package/dist/hooks/useDialogTracking.mjs.map +0 -1
- package/dist/hooks/useIsMounted.js +0 -15
- package/dist/hooks/useIsMounted.js.map +0 -1
- package/dist/hooks/useIsMounted.mjs +0 -13
- package/dist/hooks/useIsMounted.mjs.map +0 -1
- package/dist/hooks/usePathname.js +0 -85
- package/dist/hooks/usePathname.js.map +0 -1
- package/dist/hooks/usePathname.mjs +0 -83
- package/dist/hooks/usePathname.mjs.map +0 -1
- package/dist/icons.js +0 -14
- package/dist/icons.js.map +0 -1
- package/dist/icons.mjs +0 -3
- package/dist/icons.mjs.map +0 -1
- package/dist/lib/formatCurrency.js +0 -187
- package/dist/lib/formatCurrency.js.map +0 -1
- package/dist/lib/formatCurrency.mjs +0 -185
- package/dist/lib/formatCurrency.mjs.map +0 -1
- package/dist/lib/helpers.js +0 -171
- package/dist/lib/helpers.js.map +0 -1
- package/dist/lib/helpers.mjs +0 -157
- package/dist/lib/helpers.mjs.map +0 -1
- package/dist/lib/index.js +0 -33
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/index.mjs +0 -6
- package/dist/lib/index.mjs.map +0 -1
- package/dist/lib/types.js +0 -11
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/types.mjs +0 -9
- package/dist/lib/types.mjs.map +0 -1
- package/dist/lib/utils.js +0 -24
- package/dist/lib/utils.js.map +0 -1
- package/dist/lib/utils.mjs +0 -19
- package/dist/lib/utils.mjs.map +0 -1
- package/dist/providers/DeviceSizeWatcher/index.js +0 -72
- package/dist/providers/DeviceSizeWatcher/index.js.map +0 -1
- package/dist/providers/DeviceSizeWatcher/index.mjs +0 -47
- package/dist/providers/DeviceSizeWatcher/index.mjs.map +0 -1
- package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.js +0 -22
- package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.js.map +0 -1
- package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.mjs +0 -20
- package/dist/providers/DeviceSizeWatcher/useDeviceSizeStore.mjs.map +0 -1
- package/dist/providers/UISystemProvider.js +0 -197
- package/dist/providers/UISystemProvider.js.map +0 -1
- package/dist/providers/UISystemProvider.mjs +0 -188
- package/dist/providers/UISystemProvider.mjs.map +0 -1
- package/dist/providers/index.js +0 -24
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/index.mjs +0 -3
- package/dist/providers/index.mjs.map +0 -1
- package/dist/theme.js +0 -333
- package/dist/theme.js.map +0 -1
- package/dist/theme.mjs +0 -327
- 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"]}
|
package/dist/lib/helpers.js
DELETED
|
@@ -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
|
package/dist/lib/helpers.js.map
DELETED
|
@@ -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"]}
|