@lerianstudio/sindarian-ui 1.2.0 → 1.3.0-beta.1
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/charts/chart.d.ts +64 -0
- package/dist/charts/chart.d.ts.map +1 -0
- package/dist/charts/chart.js +232 -0
- package/dist/charts/index.d.ts +3 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +11 -0
- package/dist/components/breadcrumb/get-breadcrumb-paths.js +5 -2
- package/dist/components/form/date-time-picker-field/index.js +1 -1
- package/dist/components/form/file-upload-field/index.d.ts +52 -0
- package/dist/components/form/file-upload-field/index.d.ts.map +1 -0
- package/dist/components/form/file-upload-field/index.js +64 -0
- package/dist/components/form/index.d.ts +3 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +3 -0
- package/dist/components/form/radio-group-field/index.d.ts +32 -0
- package/dist/components/form/radio-group-field/index.d.ts.map +1 -0
- package/dist/components/form/radio-group-field/index.js +36 -0
- package/dist/components/form/renderable-label.d.ts +35 -0
- package/dist/components/form/renderable-label.d.ts.map +1 -0
- package/dist/components/form/renderable-label.js +57 -0
- package/dist/components/form/textarea-field/index.d.ts +31 -0
- package/dist/components/form/textarea-field/index.d.ts.map +1 -0
- package/dist/components/form/textarea-field/index.js +23 -0
- package/dist/components/table/id-table-cell.js +5 -2
- package/dist/components/ui/accordion/index.d.ts +14 -0
- package/dist/components/ui/accordion/index.d.ts.map +1 -0
- package/dist/components/ui/accordion/index.js +62 -0
- package/dist/components/ui/alert-dialog/index.d.ts +15 -0
- package/dist/components/ui/alert-dialog/index.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog/index.js +84 -0
- package/dist/components/ui/autocomplete/index.js +4 -4
- package/dist/components/ui/badge/index.d.ts.map +1 -1
- package/dist/components/ui/badge/index.js +2 -2
- package/dist/components/ui/button/index.d.ts.map +1 -1
- package/dist/components/ui/button/index.js +1 -1
- package/dist/components/ui/copy-field/index.d.ts +56 -0
- package/dist/components/ui/copy-field/index.d.ts.map +1 -0
- package/dist/components/ui/copy-field/index.js +155 -0
- package/dist/components/ui/dialog/styles.css +3 -3
- package/dist/components/ui/file-upload/index.d.ts +94 -0
- package/dist/components/ui/file-upload/index.d.ts.map +1 -0
- package/dist/components/ui/file-upload/index.js +237 -0
- package/dist/components/ui/hover-card/index.d.ts +7 -0
- package/dist/components/ui/hover-card/index.d.ts.map +1 -0
- package/dist/components/ui/hover-card/index.js +51 -0
- package/dist/components/ui/icon-button/styles.css +24 -24
- package/dist/components/ui/input/index.d.ts.map +1 -1
- package/dist/components/ui/input/index.js +6 -5
- package/dist/components/ui/input/styles.css +6 -2
- package/dist/components/ui/otp-input/index.d.ts.map +1 -1
- package/dist/components/ui/otp-input/index.js +1 -1
- package/dist/components/ui/qr-code/index.d.ts +26 -0
- package/dist/components/ui/qr-code/index.d.ts.map +1 -0
- package/dist/components/ui/qr-code/index.js +27 -0
- package/dist/components/ui/radio-group/index.d.ts +6 -0
- package/dist/components/ui/radio-group/index.d.ts.map +1 -0
- package/dist/components/ui/radio-group/index.js +48 -0
- package/dist/components/ui/scroll-area/index.d.ts +6 -0
- package/dist/components/ui/scroll-area/index.d.ts.map +1 -0
- package/dist/components/ui/scroll-area/index.js +49 -0
- package/dist/components/ui/sidebar/index.d.ts +1 -0
- package/dist/components/ui/sidebar/index.d.ts.map +1 -1
- package/dist/components/ui/sidebar/index.js +1 -0
- package/dist/components/ui/sidebar/next-router.cjs +119 -0
- package/dist/components/ui/sidebar/next-router.d.cts +7 -0
- package/dist/components/ui/sidebar/sidebar-item-button.d.ts +2 -2
- package/dist/components/ui/sidebar/sidebar-item-button.d.ts.map +1 -1
- package/dist/components/ui/sidebar/sidebar-item-button.js +3 -5
- package/dist/components/ui/sidebar/sidebar-item-icon-button.d.ts +3 -3
- package/dist/components/ui/sidebar/sidebar-item-icon-button.d.ts.map +1 -1
- package/dist/components/ui/sidebar/sidebar-item-icon-button.js +5 -7
- package/dist/components/ui/sidebar/sidebar-item.d.ts.map +1 -1
- package/dist/components/ui/sidebar/sidebar-item.js +3 -2
- package/dist/components/ui/sidebar/sidebar-router.d.ts +82 -0
- package/dist/components/ui/sidebar/sidebar-router.d.ts.map +1 -0
- package/dist/components/ui/sidebar/sidebar-router.js +126 -0
- package/dist/components/ui/toast/index.d.ts +1 -1
- package/dist/components/ui/toast/index.d.ts.map +1 -1
- package/dist/components/ui/toggle-group/index.d.ts +18 -0
- package/dist/components/ui/toggle-group/index.d.ts.map +1 -0
- package/dist/components/ui/toggle-group/index.js +87 -0
- package/dist/domain/blotter/index.d.ts +40 -0
- package/dist/domain/blotter/index.d.ts.map +1 -0
- package/dist/domain/blotter/index.js +16 -0
- package/dist/domain/delinquency-aging/aging-buckets.d.ts +57 -0
- package/dist/domain/delinquency-aging/aging-buckets.d.ts.map +1 -0
- package/dist/domain/delinquency-aging/aging-buckets.js +110 -0
- package/dist/domain/delinquency-aging/index.d.ts +71 -0
- package/dist/domain/delinquency-aging/index.d.ts.map +1 -0
- package/dist/domain/delinquency-aging/index.js +213 -0
- package/dist/domain/figure/index.d.ts +30 -0
- package/dist/domain/figure/index.d.ts.map +1 -0
- package/dist/domain/figure/index.js +18 -0
- package/dist/domain/format.d.ts +79 -0
- package/dist/domain/format.d.ts.map +1 -0
- package/dist/domain/format.js +137 -0
- package/dist/domain/index.d.ts +23 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +43 -0
- package/dist/domain/key-id/index.d.ts +31 -0
- package/dist/domain/key-id/index.d.ts.map +1 -0
- package/dist/domain/key-id/index.js +174 -0
- package/dist/domain/ledger-sheet/index.d.ts +45 -0
- package/dist/domain/ledger-sheet/index.d.ts.map +1 -0
- package/dist/domain/ledger-sheet/index.js +28 -0
- package/dist/domain/money-diff.d.ts +28 -0
- package/dist/domain/money-diff.d.ts.map +1 -0
- package/dist/domain/money-diff.js +48 -0
- package/dist/domain/money-math.d.ts +32 -0
- package/dist/domain/money-math.d.ts.map +1 -0
- package/dist/domain/money-math.js +104 -0
- package/dist/domain/money-text/index.d.ts +37 -0
- package/dist/domain/money-text/index.d.ts.map +1 -0
- package/dist/domain/money-text/index.js +115 -0
- package/dist/domain/section-label/index.d.ts +21 -0
- package/dist/domain/section-label/index.d.ts.map +1 -0
- package/dist/domain/section-label/index.js +13 -0
- package/dist/domain/status-rail/index.d.ts +40 -0
- package/dist/domain/status-rail/index.d.ts.map +1 -0
- package/dist/domain/status-rail/index.js +72 -0
- package/dist/domain/threshold-gauge/index.d.ts +84 -0
- package/dist/domain/threshold-gauge/index.d.ts.map +1 -0
- package/dist/domain/threshold-gauge/index.js +157 -0
- package/dist/enterprise/alert-banner/index.d.ts +30 -0
- package/dist/enterprise/alert-banner/index.d.ts.map +1 -0
- package/dist/enterprise/alert-banner/index.js +24 -0
- package/dist/enterprise/app-shell/index.d.ts +61 -0
- package/dist/enterprise/app-shell/index.d.ts.map +1 -0
- package/dist/enterprise/app-shell/index.js +87 -0
- package/dist/enterprise/cursor-pager/index.d.ts +21 -0
- package/dist/enterprise/cursor-pager/index.d.ts.map +1 -0
- package/dist/enterprise/cursor-pager/index.js +26 -0
- package/dist/enterprise/data-table/index.d.ts +88 -0
- package/dist/enterprise/data-table/index.d.ts.map +1 -0
- package/dist/enterprise/data-table/index.js +245 -0
- package/dist/enterprise/date-range-picker/index.d.ts +37 -0
- package/dist/enterprise/date-range-picker/index.d.ts.map +1 -0
- package/dist/enterprise/date-range-picker/index.js +92 -0
- package/dist/enterprise/detail-panel/index.d.ts +54 -0
- package/dist/enterprise/detail-panel/index.d.ts.map +1 -0
- package/dist/enterprise/detail-panel/index.js +20 -0
- package/dist/enterprise/empty-state/index.d.ts +32 -0
- package/dist/enterprise/empty-state/index.d.ts.map +1 -0
- package/dist/enterprise/empty-state/index.js +13 -0
- package/dist/enterprise/index.d.ts +26 -0
- package/dist/enterprise/index.d.ts.map +1 -0
- package/dist/enterprise/index.js +39 -0
- package/dist/enterprise/number-input/index.d.ts +55 -0
- package/dist/enterprise/number-input/index.d.ts.map +1 -0
- package/dist/enterprise/number-input/index.js +252 -0
- package/dist/enterprise/search-input/index.d.ts +32 -0
- package/dist/enterprise/search-input/index.d.ts.map +1 -0
- package/dist/enterprise/search-input/index.js +121 -0
- package/dist/enterprise/stat-card/index.d.ts +43 -0
- package/dist/enterprise/stat-card/index.d.ts.map +1 -0
- package/dist/enterprise/stat-card/index.js +67 -0
- package/dist/enterprise/status-badge/index.d.ts +31 -0
- package/dist/enterprise/status-badge/index.d.ts.map +1 -0
- package/dist/enterprise/status-badge/index.js +120 -0
- package/dist/enterprise/use-is-mobile.d.ts +20 -0
- package/dist/enterprise/use-is-mobile.d.ts.map +1 -0
- package/dist/enterprise/use-is-mobile.js +68 -0
- package/dist/enterprise/virtualized-table/index.d.ts +26 -0
- package/dist/enterprise/virtualized-table/index.d.ts.map +1 -0
- package/dist/enterprise/virtualized-table/index.js +114 -0
- package/dist/esm/charts/chart.d.ts +64 -0
- package/dist/esm/charts/chart.d.ts.map +1 -0
- package/dist/esm/charts/chart.js +191 -0
- package/dist/esm/charts/index.d.ts +3 -0
- package/dist/esm/charts/index.d.ts.map +1 -0
- package/dist/esm/charts/index.js +3 -0
- package/dist/esm/components/breadcrumb/get-breadcrumb-paths.d.ts +10 -0
- package/dist/esm/components/breadcrumb/get-breadcrumb-paths.d.ts.map +1 -0
- package/dist/esm/components/breadcrumb/get-breadcrumb-paths.js +12 -0
- package/dist/esm/components/breadcrumb/index.d.ts +11 -0
- package/dist/esm/components/breadcrumb/index.d.ts.map +1 -0
- package/dist/esm/components/breadcrumb/index.js +6 -0
- package/dist/esm/components/card/account-card/index.d.ts +32 -0
- package/dist/esm/components/card/account-card/index.d.ts.map +1 -0
- package/dist/esm/components/card/account-card/index.js +53 -0
- package/dist/esm/components/card/basic-card/index.d.ts +6 -0
- package/dist/esm/components/card/basic-card/index.d.ts.map +1 -0
- package/dist/esm/components/card/basic-card/index.js +14 -0
- package/dist/esm/components/card/dashboard-card/index.d.ts +5 -0
- package/dist/esm/components/card/dashboard-card/index.d.ts.map +1 -0
- package/dist/esm/components/card/dashboard-card/index.js +14 -0
- package/dist/esm/components/card/entity-card/index.d.ts +22 -0
- package/dist/esm/components/card/entity-card/index.d.ts.map +1 -0
- package/dist/esm/components/card/entity-card/index.js +48 -0
- package/dist/esm/components/card/index.d.ts +5 -0
- package/dist/esm/components/card/index.d.ts.map +1 -0
- package/dist/esm/components/card/index.js +4 -0
- package/dist/esm/components/dialog/confirmation-dialog/index.d.ts +16 -0
- package/dist/esm/components/dialog/confirmation-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/dialog/confirmation-dialog/index.js +25 -0
- package/dist/esm/components/dialog/confirmation-dialog/use-confirm-dialog.d.ts +31 -0
- package/dist/esm/components/dialog/confirmation-dialog/use-confirm-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialog/confirmation-dialog/use-confirm-dialog.js +49 -0
- package/dist/esm/components/dialog/index.d.ts +4 -0
- package/dist/esm/components/dialog/index.d.ts.map +1 -0
- package/dist/esm/components/dialog/index.js +3 -0
- package/dist/esm/components/dialog/large-dialog/index.d.ts +11 -0
- package/dist/esm/components/dialog/large-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/dialog/large-dialog/index.js +16 -0
- package/dist/esm/components/entity-box/index.d.ts +17 -0
- package/dist/esm/components/entity-box/index.d.ts.map +1 -0
- package/dist/esm/components/entity-box/index.js +31 -0
- package/dist/esm/components/entity-data-table/index.d.ts +17 -0
- package/dist/esm/components/entity-data-table/index.d.ts.map +1 -0
- package/dist/esm/components/entity-data-table/index.js +17 -0
- package/dist/esm/components/form/combo-box-field/index.d.ts +14 -0
- package/dist/esm/components/form/combo-box-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/combo-box-field/index.js +28 -0
- package/dist/esm/components/form/country-field/index.d.ts +5 -0
- package/dist/esm/components/form/country-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/country-field/index.js +7 -0
- package/dist/esm/components/form/date-picker-field/index.d.ts +21 -0
- package/dist/esm/components/form/date-picker-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/date-picker-field/index.js +38 -0
- package/dist/esm/components/form/date-range-field/index.d.ts +21 -0
- package/dist/esm/components/form/date-range-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/date-range-field/index.js +17 -0
- package/dist/esm/components/form/date-time-picker-field/index.d.ts +23 -0
- package/dist/esm/components/form/date-time-picker-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/date-time-picker-field/index.js +73 -0
- package/dist/esm/components/form/file-upload-field/index.d.ts +52 -0
- package/dist/esm/components/form/file-upload-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/file-upload-field/index.js +60 -0
- package/dist/esm/components/form/index.d.ts +16 -0
- package/dist/esm/components/form/index.d.ts.map +1 -0
- package/dist/esm/components/form/index.js +15 -0
- package/dist/esm/components/form/input-field/index.d.ts +26 -0
- package/dist/esm/components/form/input-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/input-field/index.js +10 -0
- package/dist/esm/components/form/otp-field/index.d.ts +18 -0
- package/dist/esm/components/form/otp-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/otp-field/index.js +15 -0
- package/dist/esm/components/form/pagination-limit-field/index.d.ts +9 -0
- package/dist/esm/components/form/pagination-limit-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/pagination-limit-field/index.js +6 -0
- package/dist/esm/components/form/password-field/index.d.ts +14 -0
- package/dist/esm/components/form/password-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/password-field/index.js +10 -0
- package/dist/esm/components/form/radio-group-field/index.d.ts +32 -0
- package/dist/esm/components/form/radio-group-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/radio-group-field/index.js +32 -0
- package/dist/esm/components/form/renderable-label.d.ts +35 -0
- package/dist/esm/components/form/renderable-label.d.ts.map +1 -0
- package/dist/esm/components/form/renderable-label.js +54 -0
- package/dist/esm/components/form/select-field/index.d.ts +20 -0
- package/dist/esm/components/form/select-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/select-field/index.js +16 -0
- package/dist/esm/components/form/state-field/index.d.ts +10 -0
- package/dist/esm/components/form/state-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/state-field/index.js +35 -0
- package/dist/esm/components/form/switch-field/index.d.ts +15 -0
- package/dist/esm/components/form/switch-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/switch-field/index.js +7 -0
- package/dist/esm/components/form/textarea-field/index.d.ts +31 -0
- package/dist/esm/components/form/textarea-field/index.d.ts.map +1 -0
- package/dist/esm/components/form/textarea-field/index.js +19 -0
- package/dist/esm/components/page/index.d.ts +4 -0
- package/dist/esm/components/page/index.d.ts.map +1 -0
- package/dist/esm/components/page/index.js +11 -0
- package/dist/esm/components/page-header/index.d.ts +33 -0
- package/dist/esm/components/page-header/index.d.ts.map +1 -0
- package/dist/esm/components/page-header/index.js +40 -0
- package/dist/esm/components/pagination/index.d.ts +8 -0
- package/dist/esm/components/pagination/index.d.ts.map +1 -0
- package/dist/esm/components/pagination/index.js +6 -0
- package/dist/esm/components/table/id-table-cell.d.ts +7 -0
- package/dist/esm/components/table/id-table-cell.d.ts.map +1 -0
- package/dist/esm/components/table/id-table-cell.js +12 -0
- package/dist/esm/components/table/index.d.ts +3 -0
- package/dist/esm/components/table/index.d.ts.map +1 -0
- package/dist/esm/components/table/index.js +2 -0
- package/dist/esm/components/table/locked-table-actions.d.ts +7 -0
- package/dist/esm/components/table/locked-table-actions.d.ts.map +1 -0
- package/dist/esm/components/table/locked-table-actions.js +7 -0
- package/dist/esm/components/table/name-table-cell.d.ts +6 -0
- package/dist/esm/components/table/name-table-cell.d.ts.map +1 -0
- package/dist/esm/components/table/name-table-cell.js +6 -0
- package/dist/esm/components/ui/accordion/index.d.ts +14 -0
- package/dist/esm/components/ui/accordion/index.d.ts.map +1 -0
- package/dist/esm/components/ui/accordion/index.js +24 -0
- package/dist/esm/components/ui/alert/index.d.ts +15 -0
- package/dist/esm/components/ui/alert/index.d.ts.map +1 -0
- package/dist/esm/components/ui/alert/index.js +38 -0
- package/dist/esm/components/ui/alert-dialog/index.d.ts +15 -0
- package/dist/esm/components/ui/alert-dialog/index.d.ts.map +1 -0
- package/dist/esm/components/ui/alert-dialog/index.js +39 -0
- package/dist/esm/components/ui/autocomplete/index.d.ts +54 -0
- package/dist/esm/components/ui/autocomplete/index.d.ts.map +1 -0
- package/dist/esm/components/ui/autocomplete/index.js +276 -0
- package/dist/esm/components/ui/autosize-textarea/index.d.ts +15 -0
- package/dist/esm/components/ui/autosize-textarea/index.d.ts.map +1 -0
- package/dist/esm/components/ui/autosize-textarea/index.js +51 -0
- package/dist/esm/components/ui/avatar/index.d.ts +7 -0
- package/dist/esm/components/ui/avatar/index.d.ts.map +1 -0
- package/dist/esm/components/ui/avatar/index.js +14 -0
- package/dist/esm/components/ui/badge/index.d.ts +11 -0
- package/dist/esm/components/ui/badge/index.d.ts.map +1 -0
- package/dist/esm/components/ui/badge/index.js +29 -0
- package/dist/esm/components/ui/breadcrumb/index.d.ts +12 -0
- package/dist/esm/components/ui/breadcrumb/index.d.ts.map +1 -0
- package/dist/esm/components/ui/breadcrumb/index.js +27 -0
- package/dist/esm/components/ui/button/index.d.ts +22 -0
- package/dist/esm/components/ui/button/index.d.ts.map +1 -0
- package/dist/esm/components/ui/button/index.js +59 -0
- package/dist/esm/components/ui/calendar/index.d.ts +9 -0
- package/dist/esm/components/ui/calendar/index.d.ts.map +1 -0
- package/dist/esm/components/ui/calendar/index.js +79 -0
- package/dist/esm/components/ui/card/index.d.ts +10 -0
- package/dist/esm/components/ui/card/index.d.ts.map +1 -0
- package/dist/esm/components/ui/card/index.js +24 -0
- package/dist/esm/components/ui/checkbox/index.d.ts +5 -0
- package/dist/esm/components/ui/checkbox/index.d.ts.map +1 -0
- package/dist/esm/components/ui/checkbox/index.js +9 -0
- package/dist/esm/components/ui/collapsible/index.d.ts +6 -0
- package/dist/esm/components/ui/collapsible/index.d.ts.map +1 -0
- package/dist/esm/components/ui/collapsible/index.js +13 -0
- package/dist/esm/components/ui/command/index.d.ts +14 -0
- package/dist/esm/components/ui/command/index.d.ts.map +1 -0
- package/dist/esm/components/ui/command/index.js +51 -0
- package/dist/esm/components/ui/copy-field/index.d.ts +56 -0
- package/dist/esm/components/ui/copy-field/index.d.ts.map +1 -0
- package/dist/esm/components/ui/copy-field/index.js +119 -0
- package/dist/esm/components/ui/dialog/index.d.ts +16 -0
- package/dist/esm/components/ui/dialog/index.d.ts.map +1 -0
- package/dist/esm/components/ui/dialog/index.js +36 -0
- package/dist/esm/components/ui/dropdown-menu/index.d.ts +27 -0
- package/dist/esm/components/ui/dropdown-menu/index.d.ts.map +1 -0
- package/dist/esm/components/ui/dropdown-menu/index.js +57 -0
- package/dist/esm/components/ui/field/index.d.ts +25 -0
- package/dist/esm/components/ui/field/index.d.ts.map +1 -0
- package/dist/esm/components/ui/field/index.js +68 -0
- package/dist/esm/components/ui/file-upload/index.d.ts +94 -0
- package/dist/esm/components/ui/file-upload/index.d.ts.map +1 -0
- package/dist/esm/components/ui/file-upload/index.js +200 -0
- package/dist/esm/components/ui/form.d.ts +39 -0
- package/dist/esm/components/ui/form.d.ts.map +1 -0
- package/dist/esm/components/ui/form.js +67 -0
- package/dist/esm/components/ui/hover-card/index.d.ts +7 -0
- package/dist/esm/components/ui/hover-card/index.d.ts.map +1 -0
- package/dist/esm/components/ui/hover-card/index.js +14 -0
- package/dist/esm/components/ui/icon-button/index.d.ts +13 -0
- package/dist/esm/components/ui/icon-button/index.d.ts.map +1 -0
- package/dist/esm/components/ui/icon-button/index.js +31 -0
- package/dist/esm/components/ui/input/adornment.d.ts +9 -0
- package/dist/esm/components/ui/input/adornment.d.ts.map +1 -0
- package/dist/esm/components/ui/input/adornment.js +17 -0
- package/dist/esm/components/ui/input/index.d.ts +18 -0
- package/dist/esm/components/ui/input/index.d.ts.map +1 -0
- package/dist/esm/components/ui/input/index.js +60 -0
- package/dist/esm/components/ui/label/index.d.ts +7 -0
- package/dist/esm/components/ui/label/index.d.ts.map +1 -0
- package/dist/esm/components/ui/label/index.js +10 -0
- package/dist/esm/components/ui/loading-button/index.d.ts +8 -0
- package/dist/esm/components/ui/loading-button/index.d.ts.map +1 -0
- package/dist/esm/components/ui/loading-button/index.js +7 -0
- package/dist/esm/components/ui/multiple-select/index.d.ts +91 -0
- package/dist/esm/components/ui/multiple-select/index.d.ts.map +1 -0
- package/dist/esm/components/ui/multiple-select/index.js +196 -0
- package/dist/esm/components/ui/otp-input/index.d.ts +13 -0
- package/dist/esm/components/ui/otp-input/index.d.ts.map +1 -0
- package/dist/esm/components/ui/otp-input/index.js +21 -0
- package/dist/esm/components/ui/paper/index.d.ts +4 -0
- package/dist/esm/components/ui/paper/index.d.ts.map +1 -0
- package/dist/esm/components/ui/paper/index.js +5 -0
- package/dist/esm/components/ui/paper-collapsible/index.d.ts +9 -0
- package/dist/esm/components/ui/paper-collapsible/index.d.ts.map +1 -0
- package/dist/esm/components/ui/paper-collapsible/index.js +19 -0
- package/dist/esm/components/ui/popover/index.d.ts +8 -0
- package/dist/esm/components/ui/popover/index.d.ts.map +1 -0
- package/dist/esm/components/ui/popover/index.js +17 -0
- package/dist/esm/components/ui/progress/index.d.ts +8 -0
- package/dist/esm/components/ui/progress/index.d.ts.map +1 -0
- package/dist/esm/components/ui/progress/index.js +8 -0
- package/dist/esm/components/ui/qr-code/index.d.ts +26 -0
- package/dist/esm/components/ui/qr-code/index.d.ts.map +1 -0
- package/dist/esm/components/ui/qr-code/index.js +24 -0
- package/dist/esm/components/ui/radio-group/index.d.ts +6 -0
- package/dist/esm/components/ui/radio-group/index.d.ts.map +1 -0
- package/dist/esm/components/ui/radio-group/index.js +12 -0
- package/dist/esm/components/ui/scroll-area/index.d.ts +6 -0
- package/dist/esm/components/ui/scroll-area/index.d.ts.map +1 -0
- package/dist/esm/components/ui/scroll-area/index.js +13 -0
- package/dist/esm/components/ui/select/index.d.ts +18 -0
- package/dist/esm/components/ui/select/index.d.ts.map +1 -0
- package/dist/esm/components/ui/select/index.js +47 -0
- package/dist/esm/components/ui/separator/index.d.ts +5 -0
- package/dist/esm/components/ui/separator/index.d.ts.map +1 -0
- package/dist/esm/components/ui/separator/index.js +8 -0
- package/dist/esm/components/ui/sheet/index.d.ts +19 -0
- package/dist/esm/components/ui/sheet/index.d.ts.map +1 -0
- package/dist/esm/components/ui/sheet/index.js +59 -0
- package/dist/esm/components/ui/sidebar/index.d.ts +11 -0
- package/dist/esm/components/ui/sidebar/index.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/index.js +10 -0
- package/dist/esm/components/ui/sidebar/next-router.cjs +119 -0
- package/dist/esm/components/ui/sidebar/next-router.d.cts +7 -0
- package/dist/esm/components/ui/sidebar/sidebar-back-button.d.ts +3 -0
- package/dist/esm/components/ui/sidebar/sidebar-back-button.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-back-button.js +5 -0
- package/dist/esm/components/ui/sidebar/sidebar-components.d.ts +23 -0
- package/dist/esm/components/ui/sidebar/sidebar-components.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-components.js +15 -0
- package/dist/esm/components/ui/sidebar/sidebar-expand-button.d.ts +7 -0
- package/dist/esm/components/ui/sidebar/sidebar-expand-button.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-expand-button.js +12 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-button.d.ts +12 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-button.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-button.js +18 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-collapsible.d.ts +12 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-collapsible.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-collapsible.js +44 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-icon-button.d.ts +12 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-icon-button.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-item-icon-button.js +14 -0
- package/dist/esm/components/ui/sidebar/sidebar-item.d.ts +13 -0
- package/dist/esm/components/ui/sidebar/sidebar-item.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-item.js +16 -0
- package/dist/esm/components/ui/sidebar/sidebar-provider.d.ts +12 -0
- package/dist/esm/components/ui/sidebar/sidebar-provider.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-provider.js +51 -0
- package/dist/esm/components/ui/sidebar/sidebar-root.d.ts +3 -0
- package/dist/esm/components/ui/sidebar/sidebar-root.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-root.js +20 -0
- package/dist/esm/components/ui/sidebar/sidebar-router.d.ts +82 -0
- package/dist/esm/components/ui/sidebar/sidebar-router.d.ts.map +1 -0
- package/dist/esm/components/ui/sidebar/sidebar-router.js +89 -0
- package/dist/esm/components/ui/skeleton/index.d.ts +3 -0
- package/dist/esm/components/ui/skeleton/index.d.ts.map +1 -0
- package/dist/esm/components/ui/skeleton/index.js +6 -0
- package/dist/esm/components/ui/stepper/index.d.ts +18 -0
- package/dist/esm/components/ui/stepper/index.d.ts.map +1 -0
- package/dist/esm/components/ui/stepper/index.js +20 -0
- package/dist/esm/components/ui/switch/index.d.ts +5 -0
- package/dist/esm/components/ui/switch/index.d.ts.map +1 -0
- package/dist/esm/components/ui/switch/index.js +8 -0
- package/dist/esm/components/ui/table/index.d.ts +21 -0
- package/dist/esm/components/ui/table/index.d.ts.map +1 -0
- package/dist/esm/components/ui/table/index.js +44 -0
- package/dist/esm/components/ui/tabs/index.d.ts +8 -0
- package/dist/esm/components/ui/tabs/index.d.ts.map +1 -0
- package/dist/esm/components/ui/tabs/index.js +17 -0
- package/dist/esm/components/ui/textarea/index.d.ts +4 -0
- package/dist/esm/components/ui/textarea/index.d.ts.map +1 -0
- package/dist/esm/components/ui/textarea/index.js +6 -0
- package/dist/esm/components/ui/time-picker/index.d.ts +18 -0
- package/dist/esm/components/ui/time-picker/index.d.ts.map +1 -0
- package/dist/esm/components/ui/time-picker/index.js +49 -0
- package/dist/esm/components/ui/toast/index.d.ts +18 -0
- package/dist/esm/components/ui/toast/index.d.ts.map +1 -0
- package/dist/esm/components/ui/toast/index.js +2 -0
- package/dist/esm/components/ui/toast/toaster.d.ts +6 -0
- package/dist/esm/components/ui/toast/toaster.d.ts.map +1 -0
- package/dist/esm/components/ui/toast/toaster.js +8 -0
- package/dist/esm/components/ui/toggle-group/index.d.ts +18 -0
- package/dist/esm/components/ui/toggle-group/index.d.ts.map +1 -0
- package/dist/esm/components/ui/toggle-group/index.js +51 -0
- package/dist/esm/components/ui/tooltip/index.d.ts +11 -0
- package/dist/esm/components/ui/tooltip/index.d.ts.map +1 -0
- package/dist/esm/components/ui/tooltip/index.js +28 -0
- package/dist/esm/domain/blotter/index.d.ts +40 -0
- package/dist/esm/domain/blotter/index.d.ts.map +1 -0
- package/dist/esm/domain/blotter/index.js +12 -0
- package/dist/esm/domain/delinquency-aging/aging-buckets.d.ts +57 -0
- package/dist/esm/domain/delinquency-aging/aging-buckets.d.ts.map +1 -0
- package/dist/esm/domain/delinquency-aging/aging-buckets.js +105 -0
- package/dist/esm/domain/delinquency-aging/index.d.ts +71 -0
- package/dist/esm/domain/delinquency-aging/index.d.ts.map +1 -0
- package/dist/esm/domain/delinquency-aging/index.js +209 -0
- package/dist/esm/domain/figure/index.d.ts +30 -0
- package/dist/esm/domain/figure/index.d.ts.map +1 -0
- package/dist/esm/domain/figure/index.js +14 -0
- package/dist/esm/domain/format.d.ts +79 -0
- package/dist/esm/domain/format.d.ts.map +1 -0
- package/dist/esm/domain/format.js +128 -0
- package/dist/esm/domain/index.d.ts +23 -0
- package/dist/esm/domain/index.d.ts.map +1 -0
- package/dist/esm/domain/index.js +19 -0
- package/dist/esm/domain/key-id/index.d.ts +31 -0
- package/dist/esm/domain/key-id/index.d.ts.map +1 -0
- package/dist/esm/domain/key-id/index.js +169 -0
- package/dist/esm/domain/ledger-sheet/index.d.ts +45 -0
- package/dist/esm/domain/ledger-sheet/index.d.ts.map +1 -0
- package/dist/esm/domain/ledger-sheet/index.js +24 -0
- package/dist/esm/domain/money-diff.d.ts +28 -0
- package/dist/esm/domain/money-diff.d.ts.map +1 -0
- package/dist/esm/domain/money-diff.js +45 -0
- package/dist/esm/domain/money-math.d.ts +32 -0
- package/dist/esm/domain/money-math.d.ts.map +1 -0
- package/dist/esm/domain/money-math.js +98 -0
- package/dist/esm/domain/money-text/index.d.ts +37 -0
- package/dist/esm/domain/money-text/index.d.ts.map +1 -0
- package/dist/esm/domain/money-text/index.js +110 -0
- package/dist/esm/domain/section-label/index.d.ts +21 -0
- package/dist/esm/domain/section-label/index.d.ts.map +1 -0
- package/dist/esm/domain/section-label/index.js +10 -0
- package/dist/esm/domain/status-rail/index.d.ts +40 -0
- package/dist/esm/domain/status-rail/index.d.ts.map +1 -0
- package/dist/esm/domain/status-rail/index.js +67 -0
- package/dist/esm/domain/threshold-gauge/index.d.ts +84 -0
- package/dist/esm/domain/threshold-gauge/index.d.ts.map +1 -0
- package/dist/esm/domain/threshold-gauge/index.js +153 -0
- package/dist/esm/enterprise/alert-banner/index.d.ts +30 -0
- package/dist/esm/enterprise/alert-banner/index.d.ts.map +1 -0
- package/dist/esm/enterprise/alert-banner/index.js +21 -0
- package/dist/esm/enterprise/app-shell/index.d.ts +61 -0
- package/dist/esm/enterprise/app-shell/index.d.ts.map +1 -0
- package/dist/esm/enterprise/app-shell/index.js +51 -0
- package/dist/esm/enterprise/cursor-pager/index.d.ts +21 -0
- package/dist/esm/enterprise/cursor-pager/index.d.ts.map +1 -0
- package/dist/esm/enterprise/cursor-pager/index.js +23 -0
- package/dist/esm/enterprise/data-table/index.d.ts +88 -0
- package/dist/esm/enterprise/data-table/index.d.ts.map +1 -0
- package/dist/esm/enterprise/data-table/index.js +242 -0
- package/dist/esm/enterprise/date-range-picker/index.d.ts +37 -0
- package/dist/esm/enterprise/date-range-picker/index.d.ts.map +1 -0
- package/dist/esm/enterprise/date-range-picker/index.js +89 -0
- package/dist/esm/enterprise/detail-panel/index.d.ts +54 -0
- package/dist/esm/enterprise/detail-panel/index.d.ts.map +1 -0
- package/dist/esm/enterprise/detail-panel/index.js +17 -0
- package/dist/esm/enterprise/empty-state/index.d.ts +32 -0
- package/dist/esm/enterprise/empty-state/index.d.ts.map +1 -0
- package/dist/esm/enterprise/empty-state/index.js +10 -0
- package/dist/esm/enterprise/index.d.ts +26 -0
- package/dist/esm/enterprise/index.d.ts.map +1 -0
- package/dist/esm/enterprise/index.js +22 -0
- package/dist/esm/enterprise/number-input/index.d.ts +55 -0
- package/dist/esm/enterprise/number-input/index.d.ts.map +1 -0
- package/dist/esm/enterprise/number-input/index.js +214 -0
- package/dist/esm/enterprise/search-input/index.d.ts +32 -0
- package/dist/esm/enterprise/search-input/index.d.ts.map +1 -0
- package/dist/esm/enterprise/search-input/index.js +85 -0
- package/dist/esm/enterprise/stat-card/index.d.ts +43 -0
- package/dist/esm/enterprise/stat-card/index.d.ts.map +1 -0
- package/dist/esm/enterprise/stat-card/index.js +64 -0
- package/dist/esm/enterprise/status-badge/index.d.ts +31 -0
- package/dist/esm/enterprise/status-badge/index.d.ts.map +1 -0
- package/dist/esm/enterprise/status-badge/index.js +116 -0
- package/dist/esm/enterprise/use-is-mobile.d.ts +20 -0
- package/dist/esm/enterprise/use-is-mobile.d.ts.map +1 -0
- package/dist/esm/enterprise/use-is-mobile.js +31 -0
- package/dist/esm/enterprise/virtualized-table/index.d.ts +26 -0
- package/dist/esm/enterprise/virtualized-table/index.d.ts.map +1 -0
- package/dist/esm/enterprise/virtualized-table/index.js +111 -0
- package/dist/esm/hooks/use-click-away.d.ts +9 -0
- package/dist/esm/hooks/use-click-away.d.ts.map +1 -0
- package/dist/esm/hooks/use-click-away.js +22 -0
- package/dist/esm/hooks/use-pagination.d.ts +13 -0
- package/dist/esm/hooks/use-pagination.d.ts.map +1 -0
- package/dist/esm/hooks/use-pagination.js +38 -0
- package/dist/esm/hooks/use-stepper.d.ts +11 -0
- package/dist/esm/hooks/use-stepper.d.ts.map +1 -0
- package/dist/esm/hooks/use-stepper.js +22 -0
- package/dist/esm/hooks/use-time.d.ts +6 -0
- package/dist/esm/hooks/use-time.d.ts.map +1 -0
- package/dist/esm/hooks/use-time.js +13 -0
- package/dist/esm/hooks/use-toast.d.ts +31 -0
- package/dist/esm/hooks/use-toast.d.ts.map +1 -0
- package/dist/esm/hooks/use-toast.js +63 -0
- package/dist/esm/index.d.ts +69 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +74 -0
- package/dist/esm/lib/storage/get-storage-object.d.ts +2 -0
- package/dist/esm/lib/storage/get-storage-object.d.ts.map +1 -0
- package/dist/esm/lib/storage/get-storage-object.js +17 -0
- package/dist/esm/lib/storage/get-storage.d.ts +2 -0
- package/dist/esm/lib/storage/get-storage.d.ts.map +1 -0
- package/dist/esm/lib/storage/get-storage.js +14 -0
- package/dist/esm/lib/storage/index.d.ts +3 -0
- package/dist/esm/lib/storage/index.d.ts.map +1 -0
- package/dist/esm/lib/storage/index.js +2 -0
- package/dist/esm/lib/typography.d.ts +17 -0
- package/dist/esm/lib/typography.d.ts.map +1 -0
- package/dist/esm/lib/typography.js +16 -0
- package/dist/esm/lib/utils.d.ts +3 -0
- package/dist/esm/lib/utils.d.ts.map +1 -0
- package/dist/esm/lib/utils.js +5 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/public/countries.json +21210 -0
- package/dist/esm/theme/get-theme-script.d.ts +3 -0
- package/dist/esm/theme/get-theme-script.d.ts.map +1 -0
- package/dist/esm/theme/get-theme-script.js +41 -0
- package/dist/esm/theme/index.d.ts +6 -0
- package/dist/esm/theme/index.d.ts.map +1 -0
- package/dist/esm/theme/index.js +4 -0
- package/dist/esm/theme/mode-toggle.d.ts +25 -0
- package/dist/esm/theme/mode-toggle.d.ts.map +1 -0
- package/dist/esm/theme/mode-toggle.js +45 -0
- package/dist/esm/theme/theme-provider.d.ts +38 -0
- package/dist/esm/theme/theme-provider.d.ts.map +1 -0
- package/dist/esm/theme/theme-provider.js +112 -0
- package/dist/esm/toast/helpers.d.ts +16 -0
- package/dist/esm/toast/helpers.d.ts.map +1 -0
- package/dist/esm/toast/helpers.js +29 -0
- package/dist/esm/toast/index.d.ts +3 -0
- package/dist/esm/toast/index.d.ts.map +1 -0
- package/dist/esm/toast/index.js +4 -0
- package/dist/esm/types/metadata-type.d.ts +2 -0
- package/dist/esm/types/metadata-type.d.ts.map +1 -0
- package/dist/esm/types/metadata-type.js +1 -0
- package/dist/esm/utils/countries.cjs +17 -0
- package/dist/esm/utils/countries.d.cts +14 -0
- package/dist/esm/utils/country-utils.d.ts +17 -0
- package/dist/esm/utils/country-utils.d.ts.map +1 -0
- package/dist/esm/utils/country-utils.js +18 -0
- package/dist/esm/utils/currency-codes.d.ts +5 -0
- package/dist/esm/utils/currency-codes.d.ts.map +1 -0
- package/dist/esm/utils/currency-codes.js +181 -0
- package/dist/globals.css +74 -0
- package/dist/hooks/use-toast.d.ts +1 -1
- package/dist/hooks/use-toast.d.ts.map +1 -1
- package/dist/hooks/use-toast.js +4 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/lib/storage/get-storage-object.d.ts.map +1 -1
- package/dist/lib/storage/get-storage-object.js +6 -2
- package/dist/lib/typography.d.ts +17 -0
- package/dist/lib/typography.d.ts.map +1 -0
- package/dist/lib/typography.js +19 -0
- package/dist/public/countries.json +21200 -21200
- package/dist/theme/get-theme-script.d.ts +3 -0
- package/dist/theme/get-theme-script.d.ts.map +1 -0
- package/dist/theme/get-theme-script.js +44 -0
- package/dist/theme/index.d.ts +6 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +11 -0
- package/dist/theme/mode-toggle.d.ts +25 -0
- package/dist/theme/mode-toggle.d.ts.map +1 -0
- package/dist/theme/mode-toggle.js +48 -0
- package/dist/theme/theme-provider.d.ts +38 -0
- package/dist/theme/theme-provider.d.ts.map +1 -0
- package/dist/theme/theme-provider.js +149 -0
- package/dist/toast/helpers.d.ts +16 -0
- package/dist/toast/helpers.d.ts.map +1 -0
- package/dist/toast/helpers.js +34 -0
- package/dist/toast/index.d.ts +3 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toast/index.js +10 -0
- package/dist/utils/countries.cjs +17 -0
- package/dist/utils/countries.d.cts +14 -0
- package/dist/utils/country-utils.js +2 -2
- package/package.json +55 -18
- package/dist/components/ui/label/label.stories.d.ts +0 -5
- package/dist/components/ui/label/label.stories.d.ts.map +0 -1
- package/dist/components/ui/label/label.stories.js +0 -24
- package/dist/components/ui/sidebar/sidebar-provider.test.d.ts +0 -2
- package/dist/components/ui/sidebar/sidebar-provider.test.d.ts.map +0 -1
- package/dist/components/ui/sidebar/sidebar-provider.test.js +0 -170
- package/dist/hooks/use-click-away.test.d.ts +0 -2
- package/dist/hooks/use-click-away.test.d.ts.map +0 -1
- package/dist/hooks/use-click-away.test.js +0 -39
- package/dist/hooks/use-stepper.test.d.ts +0 -2
- package/dist/hooks/use-stepper.test.d.ts.map +0 -1
- package/dist/hooks/use-stepper.test.js +0 -45
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ToggleGroup = ToggleGroup;
|
|
38
|
+
exports.ToggleGroupItem = ToggleGroupItem;
|
|
39
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
40
|
+
const React = __importStar(require("react"));
|
|
41
|
+
const ToggleGroupPrimitive = __importStar(require("@radix-ui/react-toggle-group"));
|
|
42
|
+
const class_variance_authority_1 = require("class-variance-authority");
|
|
43
|
+
const utils_1 = require("../../../lib/utils");
|
|
44
|
+
/**
|
|
45
|
+
* Item styling for the group. Kept local: sindarian-ui has no standalone
|
|
46
|
+
* `Toggle` primitive and the retirement census does not ask for one, so the
|
|
47
|
+
* variants live with their only consumer instead of leaking a new export.
|
|
48
|
+
*/
|
|
49
|
+
const toggleVariants = (0, class_variance_authority_1.cva)("hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
|
|
50
|
+
variants: {
|
|
51
|
+
variant: {
|
|
52
|
+
default: 'bg-transparent',
|
|
53
|
+
outline: 'border-input hover:bg-accent hover:text-accent-foreground border bg-transparent shadow-xs'
|
|
54
|
+
},
|
|
55
|
+
size: {
|
|
56
|
+
default: 'h-9 min-w-9 px-2',
|
|
57
|
+
sm: 'h-8 min-w-8 px-1.5',
|
|
58
|
+
lg: 'h-10 min-w-10 px-2.5'
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
defaultVariants: {
|
|
62
|
+
variant: 'default',
|
|
63
|
+
size: 'default'
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const ToggleGroupContext = React.createContext({
|
|
67
|
+
size: 'default',
|
|
68
|
+
variant: 'default',
|
|
69
|
+
spacing: 0
|
|
70
|
+
});
|
|
71
|
+
function ToggleGroup({ className, variant, size, spacing = 0, children, style, ...props }) {
|
|
72
|
+
return ((0, jsx_runtime_1.jsx)(ToggleGroupPrimitive.Root, { "data-slot": "toggle-group", "data-variant": variant, "data-size": size, "data-spacing": spacing,
|
|
73
|
+
// Caller style first: `--gap` is ours and must survive, but everything
|
|
74
|
+
// else the caller passes has to reach the element.
|
|
75
|
+
style: { ...style, '--gap': spacing }, className: (0, utils_1.cn)(
|
|
76
|
+
// Legacy carried a `data-[spacing=default]:...:shadow-xs` rule here that
|
|
77
|
+
// never matched — `data-spacing` is always a number. Removed rather than
|
|
78
|
+
// activated, so the rendered pixels stay identical to sindarian-x.
|
|
79
|
+
'group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md', className), ...props, children: (0, jsx_runtime_1.jsx)(ToggleGroupContext.Provider, { value: { variant, size, spacing }, children: children }) }));
|
|
80
|
+
}
|
|
81
|
+
function ToggleGroupItem({ className, children, variant, size, ...props }) {
|
|
82
|
+
const context = React.useContext(ToggleGroupContext);
|
|
83
|
+
return ((0, jsx_runtime_1.jsx)(ToggleGroupPrimitive.Item, { "data-slot": "toggle-group-item", "data-variant": context.variant || variant, "data-size": context.size || size, "data-spacing": context.spacing, className: (0, utils_1.cn)(toggleVariants({
|
|
84
|
+
variant: context.variant || variant,
|
|
85
|
+
size: context.size || size
|
|
86
|
+
}), 'w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10', 'data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l', className), ...props, children: children }));
|
|
87
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blotter + BlotterRow — the mono key/value readout of the console.
|
|
3
|
+
*
|
|
4
|
+
* Clean key/value rows separated by hairline borders (`divide-y divide-border`)
|
|
5
|
+
* — no zebra fills. Each row: an uppercase 11px sans label on the left, a mono
|
|
6
|
+
* `tabular-nums` value on the right, `hover:bg-body-surface` as the quiet row
|
|
7
|
+
* affordance (the recessed page surface, one step behind `bg-card`, in both
|
|
8
|
+
* themes). Escalate the value color (`text-credit`, `text-system-alert`) only
|
|
9
|
+
* when a metric crosses a threshold.
|
|
10
|
+
*
|
|
11
|
+
* <Blotter>
|
|
12
|
+
* <BlotterRow label="Resolved on time" value="128" />
|
|
13
|
+
* <BlotterRow label="Pending overdue" value="3" valueClassName="text-credit" />
|
|
14
|
+
* </Blotter>
|
|
15
|
+
*
|
|
16
|
+
* Renders a `<dl>`; rows are `<div>`s with `<dt>`/`<dd>`.
|
|
17
|
+
*/
|
|
18
|
+
import type { ReactNode } from 'react';
|
|
19
|
+
export type BlotterProps = {
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
className?: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function Blotter({ children, className }: BlotterProps): import("react").JSX.Element;
|
|
24
|
+
export type BlotterRowProps = {
|
|
25
|
+
label: ReactNode;
|
|
26
|
+
value: ReactNode;
|
|
27
|
+
/** Threshold-escalation class on the value (e.g. `text-credit`). */
|
|
28
|
+
valueClassName?: string;
|
|
29
|
+
className?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Stack the label above a full-width value instead of the inline
|
|
32
|
+
* label-left / value-right layout. Use for long-form prose (reasons,
|
|
33
|
+
* descriptions, notes) where a justified single line would squish the text.
|
|
34
|
+
* The value renders as wrapping sans body copy, not the mono tabular figure
|
|
35
|
+
* used by inline rows.
|
|
36
|
+
*/
|
|
37
|
+
stacked?: boolean;
|
|
38
|
+
};
|
|
39
|
+
export declare function BlotterRow({ label, value, valueClassName, className, stacked }: BlotterRowProps): import("react").JSX.Element;
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/blotter/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,+BAE5D;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,cAAc,EACd,SAAS,EACT,OAAe,EAChB,EAAE,eAAe,+BAwCjB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Blotter = Blotter;
|
|
4
|
+
exports.BlotterRow = BlotterRow;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const typography_1 = require("../../lib/typography");
|
|
7
|
+
const utils_1 = require("../../lib/utils");
|
|
8
|
+
function Blotter({ children, className }) {
|
|
9
|
+
return (0, jsx_runtime_1.jsx)("dl", { className: (0, utils_1.cn)('divide-border divide-y', className), children: children });
|
|
10
|
+
}
|
|
11
|
+
function BlotterRow({ label, value, valueClassName, className, stacked = false }) {
|
|
12
|
+
if (stacked) {
|
|
13
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('hover:bg-body-surface space-y-1 px-2 py-2 transition-colors duration-150 ease-out', className), children: [(0, jsx_runtime_1.jsx)("dt", { className: typography_1.LABEL_VOICE_CLASS, children: label }), (0, jsx_runtime_1.jsx)("dd", { className: (0, utils_1.cn)('text-foreground text-sm break-words whitespace-pre-wrap', valueClassName), children: value })] }));
|
|
14
|
+
}
|
|
15
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('hover:bg-body-surface flex items-center justify-between gap-3 px-2 py-2 transition-colors duration-150 ease-out', className), children: [(0, jsx_runtime_1.jsx)("dt", { className: typography_1.LABEL_VOICE_CLASS, children: label }), (0, jsx_runtime_1.jsx)("dd", { className: (0, utils_1.cn)('font-mono text-sm font-medium tabular-nums', valueClassName), children: value })] }));
|
|
16
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface AgingBucket {
|
|
2
|
+
/** Human label for the band, e.g. "A vencer", "31–60", "90+". */
|
|
3
|
+
label: string;
|
|
4
|
+
/** Number of items in the band. A zero is shown explicitly, never omitted. */
|
|
5
|
+
count: number;
|
|
6
|
+
/** Money total for the band. Pass a decimal STRING for lossless sums. */
|
|
7
|
+
total: string | number;
|
|
8
|
+
}
|
|
9
|
+
export type AgingBand = 'current' | 'recent' | 'aging' | 'overdue';
|
|
10
|
+
/**
|
|
11
|
+
* Overrides for the fixed pt-BR copy. Every field is optional and defaults to
|
|
12
|
+
* the current value, so a consumer that passes nothing renders exactly as
|
|
13
|
+
* before. The band words in particular are the ACCESSIBLE severity cue (the
|
|
14
|
+
* sr-only text a screen reader announces), so a consumer running in another
|
|
15
|
+
* language needs them translatable, not just the digits `locale` already
|
|
16
|
+
* covers.
|
|
17
|
+
*/
|
|
18
|
+
export interface AgingBucketsLabels {
|
|
19
|
+
/** sr-only severity word per band. Merged shallowly over the pt-BR canon. */
|
|
20
|
+
bands?: Partial<Record<AgingBand, string>>;
|
|
21
|
+
/** Caption under the count column. Defaults to "Itens". */
|
|
22
|
+
count?: string;
|
|
23
|
+
/** Caption under the money column. Defaults to "Total". */
|
|
24
|
+
total?: string;
|
|
25
|
+
/** Label of the grand-total row. Defaults to "Total geral". */
|
|
26
|
+
grandTotal?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface AgingBucketsProps {
|
|
29
|
+
/** Ordered current → oldest. Order carries meaning; not reordered internally. */
|
|
30
|
+
buckets: AgingBucket[];
|
|
31
|
+
/** ISO 4217 currency code, e.g. "BRL". Drives the minor-unit sum scale. */
|
|
32
|
+
currency?: string;
|
|
33
|
+
/** BCP 47 locale for grouping/decimal marks. Defaults to the runtime locale. */
|
|
34
|
+
locale?: string;
|
|
35
|
+
/** Render a money-math-exact grand total row across all buckets. */
|
|
36
|
+
showTotal?: boolean;
|
|
37
|
+
/** Override the fixed pt-BR copy. Omitted fields keep their defaults. */
|
|
38
|
+
labels?: AgingBucketsLabels;
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve a bucket's severity band from its ORDINAL POSITION, not its amount —
|
|
43
|
+
* the order is the information (older = worse). The first bucket is `current`;
|
|
44
|
+
* the LAST bucket (the oldest, the 90+ tail) is always `overdue`; the middle
|
|
45
|
+
* escalates `recent` → `aging` toward the tail. A single-bucket list reads as
|
|
46
|
+
* `current` (there is no escalation to show). Pure: no React, unit-tested.
|
|
47
|
+
*/
|
|
48
|
+
export declare function bucketBand(index: number, count: number): AgingBand;
|
|
49
|
+
/**
|
|
50
|
+
* Sum the bucket totals through integer minor units (BigInt) at `scale`, then
|
|
51
|
+
* render losslessly to a decimal string. Returns null if ANY bucket total is
|
|
52
|
+
* unparseable (indeterminate) — the caller renders NO_VALUE rather than a wrong
|
|
53
|
+
* grand total. Pure: the money-math third rail, unit-tested.
|
|
54
|
+
*/
|
|
55
|
+
export declare function sumBucketTotals(buckets: AgingBucket[], scale: number): string | null;
|
|
56
|
+
export declare function AgingBuckets({ buckets, currency, locale, showTotal, labels, className }: AgingBucketsProps): import("react").JSX.Element;
|
|
57
|
+
//# sourceMappingURL=aging-buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aging-buckets.d.ts","sourceRoot":"","sources":["../../../src/domain/delinquency-aging/aging-buckets.tsx"],"names":[],"mappings":"AAyCA,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1C,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA2BD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAiB,EACjB,MAAM,EACN,SAAS,EACV,EAAE,iBAAiB,+BAyGnB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bucketBand = bucketBand;
|
|
4
|
+
exports.sumBucketTotals = sumBucketTotals;
|
|
5
|
+
exports.AgingBuckets = AgingBuckets;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* AgingBuckets — an ordered, exhaustive bucketed distribution (the receivables
|
|
9
|
+
* aging schedule: current / 1–30 / 31–60 / 61–90 / 90+), each bucket carrying a
|
|
10
|
+
* count and a money total.
|
|
11
|
+
*
|
|
12
|
+
* INTERNAL to `DelinquencyAging`: not re-exported from `src/domain/index.ts`,
|
|
13
|
+
* because the port census only lists the composite. It lives here as the
|
|
14
|
+
* distribution half of that composite.
|
|
15
|
+
*
|
|
16
|
+
* INVARIANT: the buckets are ordered current → oldest and are exhaustive. The
|
|
17
|
+
* ORDER carries the information — older money is worse money — so the ordinal
|
|
18
|
+
* position and its label are the PRIMARY cue; the band glyph + sr-only word are
|
|
19
|
+
* the accessible reinforcement (WCAG 1.4.1 — the escalation survives grayscale
|
|
20
|
+
* and color-vision deficiency), and the color tint is reinforcement only, never
|
|
21
|
+
* the sole carrier of severity. The caller supplies the order; the component
|
|
22
|
+
* never reorders, because a sorted-by-amount view would destroy the one fact the
|
|
23
|
+
* widget exists to show.
|
|
24
|
+
*
|
|
25
|
+
* THIRD RAIL (money): a zero bucket renders an explicit `0` — a zero in the 90+
|
|
26
|
+
* bucket is information ("nothing slipped that far"), never an omission. When a
|
|
27
|
+
* grand total is shown it is summed through `money-math` integer minor units
|
|
28
|
+
* (BigInt, at the currency's CLDR scale) — never IEEE-754 — and rendered via
|
|
29
|
+
* `MoneyText`. A single unparseable bucket total poisons the sum to NO_VALUE
|
|
30
|
+
* rather than silently displaying a wrong number. The SAME currency scale that
|
|
31
|
+
* drives the sum is also the print scale handed to `MoneyText`, so the digits on
|
|
32
|
+
* screen are the digits that were summed — the printed total can never be a
|
|
33
|
+
* re-rounding of the computed one.
|
|
34
|
+
*
|
|
35
|
+
* Pure display: no directive, no interactivity, server-safe for RSC.
|
|
36
|
+
*/
|
|
37
|
+
const lucide_react_1 = require("lucide-react");
|
|
38
|
+
const typography_1 = require("../../lib/typography");
|
|
39
|
+
const utils_1 = require("../../lib/utils");
|
|
40
|
+
const figure_1 = require("../figure");
|
|
41
|
+
const format_1 = require("../format");
|
|
42
|
+
const money_math_1 = require("../money-math");
|
|
43
|
+
const money_text_1 = require("../money-text");
|
|
44
|
+
/** Band → glyph + tint + accessible word. The glyph (and the sr-only word) is
|
|
45
|
+
* the load-bearing severity cue; the tint only reinforces it, so the
|
|
46
|
+
* escalation survives grayscale and color-vision deficiency. */
|
|
47
|
+
const BAND = {
|
|
48
|
+
current: {
|
|
49
|
+
Icon: lucide_react_1.CircleDot,
|
|
50
|
+
tint: 'text-system-success',
|
|
51
|
+
word: 'Em dia'
|
|
52
|
+
},
|
|
53
|
+
recent: {
|
|
54
|
+
Icon: lucide_react_1.Clock,
|
|
55
|
+
tint: 'text-muted-foreground',
|
|
56
|
+
word: 'Vencido recentemente'
|
|
57
|
+
},
|
|
58
|
+
aging: {
|
|
59
|
+
Icon: lucide_react_1.AlertTriangle,
|
|
60
|
+
tint: 'text-system-alert',
|
|
61
|
+
word: 'Em atraso'
|
|
62
|
+
},
|
|
63
|
+
overdue: { Icon: lucide_react_1.AlertOctagon, tint: 'text-credit', word: 'Vencido' }
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Resolve a bucket's severity band from its ORDINAL POSITION, not its amount —
|
|
67
|
+
* the order is the information (older = worse). The first bucket is `current`;
|
|
68
|
+
* the LAST bucket (the oldest, the 90+ tail) is always `overdue`; the middle
|
|
69
|
+
* escalates `recent` → `aging` toward the tail. A single-bucket list reads as
|
|
70
|
+
* `current` (there is no escalation to show). Pure: no React, unit-tested.
|
|
71
|
+
*/
|
|
72
|
+
function bucketBand(index, count) {
|
|
73
|
+
if (count <= 1)
|
|
74
|
+
return 'current';
|
|
75
|
+
if (index === 0)
|
|
76
|
+
return 'current';
|
|
77
|
+
if (index === count - 1)
|
|
78
|
+
return 'overdue';
|
|
79
|
+
// Middle buckets: the second-oldest reads `aging`, the rest `recent`.
|
|
80
|
+
return index === count - 2 ? 'aging' : 'recent';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sum the bucket totals through integer minor units (BigInt) at `scale`, then
|
|
84
|
+
* render losslessly to a decimal string. Returns null if ANY bucket total is
|
|
85
|
+
* unparseable (indeterminate) — the caller renders NO_VALUE rather than a wrong
|
|
86
|
+
* grand total. Pure: the money-math third rail, unit-tested.
|
|
87
|
+
*/
|
|
88
|
+
function sumBucketTotals(buckets, scale) {
|
|
89
|
+
const total = (0, money_math_1.sumMinor)(buckets.map((b) => b.total), scale);
|
|
90
|
+
return total === null ? null : (0, money_math_1.minorToDecimal)(total, scale);
|
|
91
|
+
}
|
|
92
|
+
function AgingBuckets({ buckets, currency, locale, showTotal = false, labels, className }) {
|
|
93
|
+
const countLabel = labels?.count ?? 'Itens';
|
|
94
|
+
const totalLabel = labels?.total ?? 'Total';
|
|
95
|
+
const grandTotalLabel = labels?.grandTotal ?? 'Total geral';
|
|
96
|
+
// THIRD RAIL: one scale for BOTH the arithmetic and the print. `MoneyText`
|
|
97
|
+
// defaults to 2 fraction digits, so leaving it unset printed JPY (scale 0)
|
|
98
|
+
// with two decimals the currency does not have, and re-rounded the exact BHD
|
|
99
|
+
// (scale 3) grand total `1.005` to `1.01` — a printed total that disagreed
|
|
100
|
+
// with the total that was actually summed.
|
|
101
|
+
const scale = currency ? (0, money_math_1.minorDigitsOf)(currency) : 2;
|
|
102
|
+
const grandTotal = showTotal ? sumBucketTotals(buckets, scale) : null;
|
|
103
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('flex flex-col', className), children: [(0, jsx_runtime_1.jsx)("ul", { className: "flex flex-col", children: buckets.map((bucket, i) => {
|
|
104
|
+
const band = bucketBand(i, buckets.length);
|
|
105
|
+
const { Icon, tint, word } = BAND[band];
|
|
106
|
+
// Shallow merge: an unlisted band keeps its pt-BR default.
|
|
107
|
+
const bandWord = labels?.bands?.[band] ?? word;
|
|
108
|
+
return ((0, jsx_runtime_1.jsxs)("li", { className: "border-border flex items-center gap-3 border-b py-2.5 last:border-b-0", children: [(0, jsx_runtime_1.jsx)(Icon, { "aria-hidden": true, className: (0, utils_1.cn)('size-4 shrink-0', tint) }), (0, jsx_runtime_1.jsxs)("span", { className: "sr-only", children: [bandWord, ": "] }), (0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(typography_1.LABEL_VOICE_CLASS, 'text-foreground min-w-0 flex-1 tracking-normal normal-case'), children: bucket.label }), (0, jsx_runtime_1.jsxs)("span", { className: "flex shrink-0 flex-col items-end leading-none", children: [(0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: "text-foreground", children: (0, format_1.formatCount)(bucket.count, locale) }), (0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(typography_1.LABEL_VOICE_CLASS, 'mt-1'), children: countLabel })] }), (0, jsx_runtime_1.jsxs)("span", { className: "flex w-32 shrink-0 flex-col items-end leading-none sm:w-40", children: [(0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: (0, utils_1.cn)(band === 'overdue' && 'text-credit'), children: (0, jsx_runtime_1.jsx)(money_text_1.MoneyText, { amount: bucket.total, currency: currency, fractionDigits: scale, locale: locale, signColor: false }) }), (0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(typography_1.LABEL_VOICE_CLASS, 'mt-1'), children: totalLabel })] })] }, `${bucket.label}-${i}`));
|
|
109
|
+
}) }), showTotal ? ((0, jsx_runtime_1.jsxs)("div", { className: "border-border flex items-center gap-3 border-t-2 pt-2.5", children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": true, className: "size-4 shrink-0" }), (0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(typography_1.LABEL_VOICE_CLASS, 'text-foreground min-w-0 flex-1'), children: grandTotalLabel }), (0, jsx_runtime_1.jsx)("span", { className: "w-32 shrink-0 text-right sm:w-40", children: grandTotal === null ? ((0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: "text-muted-foreground", children: format_1.NO_VALUE })) : ((0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: "text-foreground font-semibold", children: (0, jsx_runtime_1.jsx)(money_text_1.MoneyText, { amount: grandTotal, currency: currency, fractionDigits: scale, locale: locale, signColor: false }) })) })] })) : null] }));
|
|
110
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { GaugeBand } from '../threshold-gauge';
|
|
2
|
+
import type { AgingBucket, AgingBucketsLabels } from './aging-buckets';
|
|
3
|
+
export type { AgingBand, AgingBucketsLabels } from './aging-buckets';
|
|
4
|
+
/** A bucket in the aging schedule, plus the flag that marks it past due. The
|
|
5
|
+
* `overdue` flag is what the rate's NUMERATOR sums — the caller declares which
|
|
6
|
+
* bands count as delinquent (typically every band after "current"). */
|
|
7
|
+
export interface DelinquencyBucket extends AgingBucket {
|
|
8
|
+
/** Whether this band counts toward the overdue (past-due) numerator. */
|
|
9
|
+
overdue?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** The delinquency rate resolved from EXACT integer minor-unit totals. `rate`
|
|
12
|
+
* is null for a zero/empty/indeterminate portfolio — never NaN. */
|
|
13
|
+
export interface DelinquencyRate {
|
|
14
|
+
/** overdueMinor / totalMinor as a 0..1 ratio; null when undefined. */
|
|
15
|
+
rate: number | null;
|
|
16
|
+
/** Σ(overdue bucket totals) in minor units; null if any total is unparseable. */
|
|
17
|
+
overdueMinor: bigint | null;
|
|
18
|
+
/** Σ(all bucket totals) in minor units; null if any total is unparseable. */
|
|
19
|
+
totalMinor: bigint | null;
|
|
20
|
+
/** True when the RATE cannot be determined: a bucket total that could not be
|
|
21
|
+
* parsed, or a negative bucket total (parseable, but not a share of a
|
|
22
|
+
* portfolio). The sums may still be present in the negative case. */
|
|
23
|
+
indeterminate: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* THIRD RAIL: the delinquency rate = overdue total / portfolio total, with both
|
|
27
|
+
* totals summed through integer minor units (BigInt) at `scale`. The only float
|
|
28
|
+
* operation is the final division of two EXACT integers — never a float sum of
|
|
29
|
+
* decimals. A zero portfolio gives a null rate (explicit empty, no NaN); an
|
|
30
|
+
* unparseable total poisons everything to indeterminate. Pure: unit-tested.
|
|
31
|
+
*
|
|
32
|
+
* Internal: exported for its unit tests, never from `src/domain/index.ts`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function delinquencyRate(buckets: DelinquencyBucket[], scale: number): DelinquencyRate;
|
|
35
|
+
export interface DelinquencyAgingProps {
|
|
36
|
+
/** Ordered current → oldest. Order carries meaning; not reordered internally.
|
|
37
|
+
* Each band's `overdue` flag selects it into the rate numerator. */
|
|
38
|
+
buckets: DelinquencyBucket[];
|
|
39
|
+
/** ISO 4217 currency code, e.g. "BRL". Drives the minor-unit rate scale. */
|
|
40
|
+
currency?: string;
|
|
41
|
+
/** BCP 47 locale for the percent decimal mark and the bucket figures. */
|
|
42
|
+
locale?: string;
|
|
43
|
+
/** Quiet caption above the rate readout. Defaults to "Inadimplência". */
|
|
44
|
+
rateLabel?: string;
|
|
45
|
+
/** sr-only rate band word per band ("Saudável" / "Elevada" / "Em estresse").
|
|
46
|
+
* Merged shallowly; an unlisted band keeps its pt-BR default. This is the
|
|
47
|
+
* ACCESSIBLE band cue, so it has to be translatable — `locale` only reaches
|
|
48
|
+
* the digits. */
|
|
49
|
+
rateBandLabels?: Partial<Record<GaugeBand, string>>;
|
|
50
|
+
/** Readout when the portfolio is empty. Defaults to "sem carteira". */
|
|
51
|
+
emptyLabel?: string;
|
|
52
|
+
/** Readout when the rate cannot be determined. Defaults to "indeterminada". */
|
|
53
|
+
indeterminateLabel?: string;
|
|
54
|
+
/** Override the fixed pt-BR copy of the distribution below (band words, the
|
|
55
|
+
* count/money captions, the grand-total row). Omitted fields keep their
|
|
56
|
+
* defaults. */
|
|
57
|
+
bucketLabels?: AgingBucketsLabels;
|
|
58
|
+
/** Warn edge for the rate band (0..1 ratio). Crossing it strictly → elevated.
|
|
59
|
+
* Compared against the EXACT minor-unit ratio, with a resolution floor of
|
|
60
|
+
* 1e-18: a magnitude finer than that is treated as 1e-18, and a non-finite
|
|
61
|
+
* value is treated as no threshold at all. */
|
|
62
|
+
warn?: number;
|
|
63
|
+
/** Breach edge for the rate band (0..1 ratio). Crossing it strictly → distressed.
|
|
64
|
+
* Same 1e-18 resolution floor and non-finite handling as `warn`. */
|
|
65
|
+
breach?: number;
|
|
66
|
+
/** Render the money-math-exact grand total row under the distribution. */
|
|
67
|
+
showTotal?: boolean;
|
|
68
|
+
className?: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function DelinquencyAging({ buckets, currency, locale, rateLabel, rateBandLabels, emptyLabel, indeterminateLabel, bucketLabels, warn, breach, showTotal, className }: DelinquencyAgingProps): import("react").JSX.Element;
|
|
71
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/delinquency-aging/index.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAKtE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAOpE;;wEAEwE;AACxE,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;oEACoE;AACpE,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,iFAAiF;IACjF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;0EAEsE;IACtE,aAAa,EAAE,OAAO,CAAA;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,KAAK,EAAE,MAAM,GACZ,eAAe,CAuDjB;AAoFD,MAAM,WAAW,qBAAqB;IACpC;yEACqE;IACrE,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;sBAGkB;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;oBAEgB;IAChB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC;;;mDAG+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;yEACqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAA2B,EAC3B,cAAc,EACd,UAA2B,EAC3B,kBAAoC,EACpC,YAAY,EACZ,IAAW,EACX,MAAY,EACZ,SAAiB,EACjB,SAAS,EACV,EAAE,qBAAqB,+BAyEvB"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.delinquencyRate = delinquencyRate;
|
|
4
|
+
exports.DelinquencyAging = DelinquencyAging;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* DelinquencyAging — a loan/receivable delinquency surface: the ordered overdue
|
|
8
|
+
* aging distribution PLUS the headline delinquency rate (the share of portfolio
|
|
9
|
+
* value that is past due).
|
|
10
|
+
*
|
|
11
|
+
* <DelinquencyAging
|
|
12
|
+
* currency="BRL"
|
|
13
|
+
* locale="pt-BR"
|
|
14
|
+
* warn={0.05}
|
|
15
|
+
* breach={0.1}
|
|
16
|
+
* buckets={[
|
|
17
|
+
* { label: 'A vencer', count: 312, total: '1840500.00', overdue: false },
|
|
18
|
+
* { label: '1–30', count: 84, total: '402300.00', overdue: true },
|
|
19
|
+
* { label: '31–60', count: 21, total: '118900.00', overdue: true },
|
|
20
|
+
* { label: '61–90', count: 9, total: '54200.00', overdue: true },
|
|
21
|
+
* { label: '90+', count: 4, total: '38100.00', overdue: true }
|
|
22
|
+
* ]}
|
|
23
|
+
* />
|
|
24
|
+
*
|
|
25
|
+
* The distribution is delegated whole to `AgingBuckets`: it owns the ordered
|
|
26
|
+
* current → 90+ schedule, the per-bucket count/total, the ordinal band cue, and
|
|
27
|
+
* the money-math-exact grand total. This composite adds only the one fact aging
|
|
28
|
+
* alone does not state — the delinquency RATE.
|
|
29
|
+
*
|
|
30
|
+
* THIRD RAIL (money): the rate is overdueTotal / portfolioTotal, and BOTH totals
|
|
31
|
+
* are summed in integer minor units (BigInt, at the currency's CLDR scale) via
|
|
32
|
+
* `money-math` — never an IEEE-754 sum of decimals (0.1 + 0.2 ≠ 0.3 in float, a
|
|
33
|
+
* silent basis-point error on a portfolio). The single floating-point operation
|
|
34
|
+
* is the FINAL division of two already-exact integers, which is the correct,
|
|
35
|
+
* lossless-enough place for it (a ratio is not money). A zero portfolio yields a
|
|
36
|
+
* null rate — an explicit empty readout, never a NaN. A single unparseable
|
|
37
|
+
* bucket total poisons the rate to indeterminate rather than reporting a wrong
|
|
38
|
+
* share.
|
|
39
|
+
*
|
|
40
|
+
* NON-COLOR CUE (WCAG 1.4.1): the rate band (healthy / elevated / distressed) is
|
|
41
|
+
* resolved through the gauge's strict-edge `gaugeBand` (higher-is-worse: more
|
|
42
|
+
* overdue is worse) and named with a glyph + an sr-only word + a tint — the tint
|
|
43
|
+
* is reinforcement only, so the band survives grayscale and color-vision
|
|
44
|
+
* deficiency. A distressed rate reads loud (credit-red, role='alert').
|
|
45
|
+
*
|
|
46
|
+
* Pure display: no directive, no interactivity, server-safe for RSC.
|
|
47
|
+
*/
|
|
48
|
+
const lucide_react_1 = require("lucide-react");
|
|
49
|
+
const typography_1 = require("../../lib/typography");
|
|
50
|
+
const utils_1 = require("../../lib/utils");
|
|
51
|
+
const figure_1 = require("../figure");
|
|
52
|
+
const format_1 = require("../format");
|
|
53
|
+
const money_math_1 = require("../money-math");
|
|
54
|
+
const section_label_1 = require("../section-label");
|
|
55
|
+
const aging_buckets_1 = require("./aging-buckets");
|
|
56
|
+
/** Fixed-point scale for the rate division: 1e12 keeps twelve decimal places of
|
|
57
|
+
* a 0..1 ratio, and both it and any in-range scaled quotient stay well inside
|
|
58
|
+
* the exact-integer range of a double (2^53), so the conversion is lossless. */
|
|
59
|
+
const RATE_PRECISION = 1000000000000n;
|
|
60
|
+
/**
|
|
61
|
+
* THIRD RAIL: the delinquency rate = overdue total / portfolio total, with both
|
|
62
|
+
* totals summed through integer minor units (BigInt) at `scale`. The only float
|
|
63
|
+
* operation is the final division of two EXACT integers — never a float sum of
|
|
64
|
+
* decimals. A zero portfolio gives a null rate (explicit empty, no NaN); an
|
|
65
|
+
* unparseable total poisons everything to indeterminate. Pure: unit-tested.
|
|
66
|
+
*
|
|
67
|
+
* Internal: exported for its unit tests, never from `src/domain/index.ts`.
|
|
68
|
+
*/
|
|
69
|
+
function delinquencyRate(buckets, scale) {
|
|
70
|
+
// Parse each bucket exactly once: the sums and the per-bucket SIGN check both
|
|
71
|
+
// come off the same pass, so the two can never disagree about the same input.
|
|
72
|
+
const parsed = buckets.map((b) => (0, money_math_1.toMinor)(b.total, scale));
|
|
73
|
+
if (parsed.some((m) => m === null)) {
|
|
74
|
+
return {
|
|
75
|
+
rate: null,
|
|
76
|
+
overdueMinor: null,
|
|
77
|
+
totalMinor: null,
|
|
78
|
+
indeterminate: true
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
let totalMinor = 0n;
|
|
82
|
+
let overdueMinor = 0n;
|
|
83
|
+
let hasNegativeBucket = false;
|
|
84
|
+
parsed.forEach((m, i) => {
|
|
85
|
+
const minor = m;
|
|
86
|
+
if (minor < 0n)
|
|
87
|
+
hasNegativeBucket = true;
|
|
88
|
+
totalMinor += minor;
|
|
89
|
+
if (buckets[i].overdue)
|
|
90
|
+
overdueMinor += minor;
|
|
91
|
+
});
|
|
92
|
+
// A NEGATIVE bucket total is parseable but not interpretable as a share of a
|
|
93
|
+
// portfolio: overdue/total stops being bounded by 0..1 the moment a component
|
|
94
|
+
// is negative (a -50 current band against a 100 overdue band yields "200%
|
|
95
|
+
// delinquent"), and it can also cancel the denominator toward zero. A credit
|
|
96
|
+
// adjustment is real data, but it is not aging data, so the honest answer is
|
|
97
|
+
// that the RATE cannot be determined — the sums stay, since they are still
|
|
98
|
+
// correct, and the readout takes the no-value path. Legacy divided anyway and
|
|
99
|
+
// printed the out-of-range percentage.
|
|
100
|
+
if (hasNegativeBucket) {
|
|
101
|
+
return { rate: null, overdueMinor, totalMinor, indeterminate: true };
|
|
102
|
+
}
|
|
103
|
+
// A zero portfolio has no rate to report — null, never overdueMinor/0 (NaN).
|
|
104
|
+
if (totalMinor === 0n) {
|
|
105
|
+
return { rate: null, overdueMinor, totalMinor, indeterminate: false };
|
|
106
|
+
}
|
|
107
|
+
// The division is done as a BOUNDED BigInt ratio first, then converted once.
|
|
108
|
+
// Converting the two totals to Number separately overflowed on a large
|
|
109
|
+
// portfolio: past ~1.8e308 each side becomes Infinity and Infinity/Infinity is
|
|
110
|
+
// NaN — a portfolio big enough to matter reported no rate at all. Scaling the
|
|
111
|
+
// numerator by RATE_PRECISION keeps the quotient the size of a ratio (not the
|
|
112
|
+
// size of the money), so the single Number() sees a value it can hold exactly.
|
|
113
|
+
const scaled = (overdueMinor * RATE_PRECISION) / totalMinor;
|
|
114
|
+
const rate = Number(scaled) / Number(RATE_PRECISION);
|
|
115
|
+
// A ratio that still cannot be represented is no rate at all — the readout
|
|
116
|
+
// shows the no-value placeholder rather than a NaN/Infinity artifact.
|
|
117
|
+
if (!Number.isFinite(rate)) {
|
|
118
|
+
return { rate: null, overdueMinor, totalMinor, indeterminate: false };
|
|
119
|
+
}
|
|
120
|
+
return { rate, overdueMinor, totalMinor, indeterminate: false };
|
|
121
|
+
}
|
|
122
|
+
/** Fixed-point scale for comparing the ratio against a float threshold as exact
|
|
123
|
+
* integers. 1e18 is well past the ~1e-16 relative precision a double carries,
|
|
124
|
+
* so the comparison is exact to the limit of the threshold value itself. */
|
|
125
|
+
const THRESHOLD_SCALE = 10n ** 18n;
|
|
126
|
+
/**
|
|
127
|
+
* THIRD RAIL: `overdue / total > threshold`, decided on EXACT integers.
|
|
128
|
+
*
|
|
129
|
+
* The float `rate` is a TRUNCATED view of the ratio — RATE_PRECISION drops every
|
|
130
|
+
* digit past 1e-12 — so a rate a hair ABOVE a threshold rounds down onto it, and
|
|
131
|
+
* the strict-edge rule then reads it as the calmer band. 500000000001 /
|
|
132
|
+
* 10000000000000 is 0.0500000000001, genuinely past a 0.05 warn edge, and
|
|
133
|
+
* truncates to exactly 0.05, which reported "Saudável" on a portfolio that had
|
|
134
|
+
* crossed into "Elevada". Cross-multiplying keeps the comparison in integers,
|
|
135
|
+
* where no digit is dropped.
|
|
136
|
+
*/
|
|
137
|
+
function ratioExceeds(overdue, total, threshold) {
|
|
138
|
+
// A non-finite threshold is no threshold: nothing can be past it.
|
|
139
|
+
if (!Number.isFinite(threshold))
|
|
140
|
+
return false;
|
|
141
|
+
// Scaling overflows to ±Infinity for a threshold that is finite but huge —
|
|
142
|
+
// 1e300 is enough, MAX_VALUE certainly — and `BigInt(Infinity)` throws a
|
|
143
|
+
// RangeError, mid-render, taking the surface down. Both overflow directions
|
|
144
|
+
// have an EXACT answer, so this degrades to the right result rather than a
|
|
145
|
+
// merely safe one: an overflowed positive threshold is one no 0..1 ratio could
|
|
146
|
+
// ever reach (not exceeded), an overflowed negative one sits below every ratio
|
|
147
|
+
// (always exceeded).
|
|
148
|
+
const scaled = Math.round(threshold * Number(THRESHOLD_SCALE));
|
|
149
|
+
if (!Number.isFinite(scaled))
|
|
150
|
+
return scaled < 0;
|
|
151
|
+
let scaledInt = BigInt(scaled);
|
|
152
|
+
// A threshold FINER than one unit of the scale rounds to zero, and a zero
|
|
153
|
+
// threshold means "anything above zero is past it" — the exact opposite of what
|
|
154
|
+
// a tiny positive threshold asks for. 4e-19 scaled to 0, so a ratio of 1e-19
|
|
155
|
+
// was reported as exceeding it. Clamp to one unit instead, keeping the sign, so
|
|
156
|
+
// a sub-scale threshold behaves as the finest one this comparison supports.
|
|
157
|
+
//
|
|
158
|
+
// ponytail: the floor is 1e-18 (THRESHOLD_SCALE), so a threshold between 0 and
|
|
159
|
+
// 1e-18 is treated as 1e-18 and a ratio in that sliver reads calmer than the
|
|
160
|
+
// literal number asks. Immaterial for a delinquency ratio — a portfolio would
|
|
161
|
+
// need ~1e18 currency units for one minor unit to land there — and the honest
|
|
162
|
+
// alternative is exact rational threshold conversion, which buys nothing real.
|
|
163
|
+
// An EXACT zero is left alone: every positive ratio does exceed it.
|
|
164
|
+
if (scaledInt === 0n && threshold !== 0) {
|
|
165
|
+
scaledInt = threshold < 0 ? -1n : 1n;
|
|
166
|
+
}
|
|
167
|
+
return overdue * THRESHOLD_SCALE > scaledInt * total;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The rate band, resolved from the exact minor-unit ratio. Mirrors `gaugeBand`'s
|
|
171
|
+
* higher-is-worse STRICT-edge canon (a ratio exactly ON a threshold stays in the
|
|
172
|
+
* calmer band) rather than calling it: `gaugeBand` takes a float, and handing it
|
|
173
|
+
* the truncated rate is precisely the defect above.
|
|
174
|
+
*/
|
|
175
|
+
function exactBand(overdue, total, warn, breach) {
|
|
176
|
+
if (ratioExceeds(overdue, total, breach))
|
|
177
|
+
return 'breach';
|
|
178
|
+
if (ratioExceeds(overdue, total, warn))
|
|
179
|
+
return 'warn';
|
|
180
|
+
return 'low';
|
|
181
|
+
}
|
|
182
|
+
/** Band → glyph + tint + accessible word. The glyph and sr-only word are the
|
|
183
|
+
* load-bearing cue; the tint only reinforces, so the band survives grayscale
|
|
184
|
+
* and color-vision deficiency. Mirrors the gauge's three-band canon, renamed
|
|
185
|
+
* to the delinquency vocabulary. */
|
|
186
|
+
const RATE_BAND = {
|
|
187
|
+
low: { Icon: lucide_react_1.ShieldCheck, tint: 'text-system-success', word: 'Saudável' },
|
|
188
|
+
warn: { Icon: lucide_react_1.TriangleAlert, tint: 'text-system-alert', word: 'Elevada' },
|
|
189
|
+
breach: { Icon: lucide_react_1.AlertOctagon, tint: 'text-credit', word: 'Em estresse' }
|
|
190
|
+
};
|
|
191
|
+
function DelinquencyAging({ buckets, currency, locale, rateLabel = 'Inadimplência', rateBandLabels, emptyLabel = 'sem carteira', indeterminateLabel = 'indeterminada', bucketLabels, warn = 0.05, breach = 0.1, showTotal = false, className }) {
|
|
192
|
+
// THIRD RAIL: the rate scale and the two totals come from money-math, never
|
|
193
|
+
// float. The division below is of two exact BigInt-derived integers.
|
|
194
|
+
const scale = currency ? (0, money_math_1.minorDigitsOf)(currency) : 2;
|
|
195
|
+
const { rate, overdueMinor, totalMinor, indeterminate } = delinquencyRate(buckets, scale);
|
|
196
|
+
// The band is only meaningful when there is a rate; an empty/indeterminate
|
|
197
|
+
// portfolio has no band to name (rendered as the explicit no-value readout).
|
|
198
|
+
const hasRate = rate !== null;
|
|
199
|
+
// higher-is-worse: more value past due is worse. The band comes off the EXACT
|
|
200
|
+
// minor-unit ratio, never `rate` — that float is truncated at 1e-12 and is for
|
|
201
|
+
// DISPLAY only (one decimal place, where the truncation cannot show).
|
|
202
|
+
const band = hasRate && overdueMinor !== null && totalMinor !== null
|
|
203
|
+
? exactBand(overdueMinor, totalMinor, warn, breach)
|
|
204
|
+
: 'low';
|
|
205
|
+
const { Icon, tint, word } = RATE_BAND[band];
|
|
206
|
+
// Shallow merge: an unlisted band keeps its pt-BR default.
|
|
207
|
+
const bandWord = rateBandLabels?.[band] ?? word;
|
|
208
|
+
const distressed = band === 'breach';
|
|
209
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)('flex flex-col gap-4', className), children: [(0, jsx_runtime_1.jsxs)("header", { className: "flex items-baseline justify-between gap-3", children: [(0, jsx_runtime_1.jsx)(section_label_1.SectionLabel, { as: "span", children: rateLabel }), hasRate ? ((0, jsx_runtime_1.jsxs)("span", {
|
|
210
|
+
// A distressed rate is a credit alarm: announced the moment it
|
|
211
|
+
// crosses the band, so assistive tech does not lean on the tint.
|
|
212
|
+
role: distressed ? 'alert' : undefined, className: (0, utils_1.cn)('inline-flex items-center gap-1.5', tint), children: [(0, jsx_runtime_1.jsx)(Icon, { "aria-hidden": true, className: "size-4 shrink-0" }), (0, jsx_runtime_1.jsxs)("span", { className: "sr-only", children: [bandWord, ": "] }), (0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: tint, children: (0, format_1.formatPercent)(rate, { unit: 'ratio', locale }) })] })) : ((0, jsx_runtime_1.jsxs)("span", { className: "text-muted-foreground inline-flex items-center gap-1.5", children: [(0, jsx_runtime_1.jsx)("span", { className: (0, utils_1.cn)(typography_1.LABEL_VOICE_CLASS, 'tracking-normal normal-case'), children: indeterminate ? indeterminateLabel : emptyLabel }), (0, jsx_runtime_1.jsx)(figure_1.Figure, { size: "row", className: "text-muted-foreground", children: format_1.NO_VALUE })] }))] }), (0, jsx_runtime_1.jsx)(aging_buckets_1.AgingBuckets, { buckets: buckets, currency: currency, locale: locale, showTotal: showTotal, labels: bucketLabels })] }));
|
|
213
|
+
}
|