@dynamic-framework/ui-react 2.9.0 → 2.11.0
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/DPortalStack-6zJm6JoD.js +14 -0
- package/dist/DPortalStack-6zJm6JoD.js.map +1 -0
- package/dist/DPortalStack-D1-GGU4C.js +12 -0
- package/dist/DPortalStack-D1-GGU4C.js.map +1 -0
- package/dist/api.json +7429 -0
- package/dist/css/dynamic-ui.css +95 -26
- package/dist/css/dynamic-ui.min.css +2 -2
- package/dist/esm/components/DAlert/DAlert.js +16 -0
- package/dist/esm/components/DAlert/DAlert.js.map +1 -0
- package/dist/esm/components/DAlert/index.js +6 -0
- package/dist/esm/components/DAlert/index.js.map +1 -0
- package/dist/esm/components/DAvatar/DAvatar.js +23 -0
- package/dist/esm/components/DAvatar/DAvatar.js.map +1 -0
- package/dist/esm/components/DAvatar/index.js +6 -0
- package/dist/esm/components/DAvatar/index.js.map +1 -0
- package/dist/esm/components/DBadge/DBadge.js +31 -0
- package/dist/esm/components/DBadge/DBadge.js.map +1 -0
- package/dist/esm/components/DBadge/index.js +6 -0
- package/dist/esm/components/DBadge/index.js.map +1 -0
- package/dist/esm/components/DBox/DBox.js +9 -0
- package/dist/esm/components/DBox/DBox.js.map +1 -0
- package/dist/esm/components/DBox/index.js +6 -0
- package/dist/esm/components/DBox/index.js.map +1 -0
- package/dist/esm/components/DBoxFile/DBoxFile.js +26 -0
- package/dist/esm/components/DBoxFile/DBoxFile.js.map +1 -0
- package/dist/esm/components/DBoxFile/index.js +6 -0
- package/dist/esm/components/DBoxFile/index.js.map +1 -0
- package/dist/esm/components/DBoxFile/useDBoxFile.js +236 -0
- package/dist/esm/components/DBoxFile/useDBoxFile.js.map +1 -0
- package/dist/esm/components/DBoxFile/utils.js +127 -0
- package/dist/esm/components/DBoxFile/utils.js.map +1 -0
- package/dist/esm/components/DButton/DButton.js +84 -0
- package/dist/esm/components/DButton/DButton.js.map +1 -0
- package/dist/esm/components/DButton/index.js +6 -0
- package/dist/esm/components/DButton/index.js.map +1 -0
- package/dist/esm/components/DButtonIcon/DButtonIcon.js +55 -0
- package/dist/esm/components/DButtonIcon/DButtonIcon.js.map +1 -0
- package/dist/esm/components/DButtonIcon/index.js +6 -0
- package/dist/esm/components/DButtonIcon/index.js.map +1 -0
- package/dist/esm/components/DButtonIcon/warnMissingAccessibleName.js +40 -0
- package/dist/esm/components/DButtonIcon/warnMissingAccessibleName.js.map +1 -0
- package/dist/esm/components/DCard/DCard.js +17 -0
- package/dist/esm/components/DCard/DCard.js.map +1 -0
- package/dist/esm/components/DCard/components/DCardBody.js +9 -0
- package/dist/esm/components/DCard/components/DCardBody.js.map +1 -0
- package/dist/esm/components/DCard/components/DCardFooter.js +9 -0
- package/dist/esm/components/DCard/components/DCardFooter.js.map +1 -0
- package/dist/esm/components/DCard/components/DCardHeader.js +9 -0
- package/dist/esm/components/DCard/components/DCardHeader.js.map +1 -0
- package/dist/esm/components/DCard/index.js +9 -0
- package/dist/esm/components/DCard/index.js.map +1 -0
- package/dist/esm/components/DCarousel/DCarousel.js +39 -0
- package/dist/esm/components/DCarousel/DCarousel.js.map +1 -0
- package/dist/esm/components/DCarousel/components/DCarouselSlide.js +12 -0
- package/dist/esm/components/DCarousel/components/DCarouselSlide.js.map +1 -0
- package/dist/esm/components/DCarousel/index.js +7 -0
- package/dist/esm/components/DCarousel/index.js.map +1 -0
- package/dist/esm/components/DChip/DChip.js +18 -0
- package/dist/esm/components/DChip/DChip.js.map +1 -0
- package/dist/esm/components/DChip/index.js +6 -0
- package/dist/esm/components/DChip/index.js.map +1 -0
- package/dist/esm/components/DCollapse/DCollapse.js +30 -0
- package/dist/esm/components/DCollapse/DCollapse.js.map +1 -0
- package/dist/esm/components/DCollapse/index.js +6 -0
- package/dist/esm/components/DCollapse/index.js.map +1 -0
- package/dist/esm/components/DConfirmModal/DConfirmModalContainer.js +59 -0
- package/dist/esm/components/DConfirmModal/DConfirmModalContainer.js.map +1 -0
- package/dist/esm/components/DConfirmModal/DConfirmModalUI.js +39 -0
- package/dist/esm/components/DConfirmModal/DConfirmModalUI.js.map +1 -0
- package/dist/esm/components/DConfirmModal/confirmModalStore.js +38 -0
- package/dist/esm/components/DConfirmModal/confirmModalStore.js.map +1 -0
- package/dist/esm/components/DCreditCard/DCreditCard.js +15 -0
- package/dist/esm/components/DCreditCard/DCreditCard.js.map +1 -0
- package/dist/esm/components/DCreditCard/index.js +6 -0
- package/dist/esm/components/DCreditCard/index.js.map +1 -0
- package/dist/esm/components/DCurrencyText/DCurrencyText.js +10 -0
- package/dist/esm/components/DCurrencyText/DCurrencyText.js.map +1 -0
- package/dist/esm/components/DCurrencyText/index.js +6 -0
- package/dist/esm/components/DCurrencyText/index.js.map +1 -0
- package/dist/esm/components/DDataStateWrapper/DDataStateWrapper.js +42 -0
- package/dist/esm/components/DDataStateWrapper/DDataStateWrapper.js.map +1 -0
- package/dist/esm/components/DDataStateWrapper/components/EmptyState.js +10 -0
- package/dist/esm/components/DDataStateWrapper/components/EmptyState.js.map +1 -0
- package/dist/esm/components/DDataStateWrapper/components/ErrorState.js +10 -0
- package/dist/esm/components/DDataStateWrapper/components/ErrorState.js.map +1 -0
- package/dist/esm/components/DDataStateWrapper/components/LoadingState.js +8 -0
- package/dist/esm/components/DDataStateWrapper/components/LoadingState.js.map +1 -0
- package/dist/esm/components/DDataStateWrapper/index.js +9 -0
- package/dist/esm/components/DDataStateWrapper/index.js.map +1 -0
- package/dist/esm/components/DDatePicker/DDatePicker.js +54 -0
- package/dist/esm/components/DDatePicker/DDatePicker.js.map +1 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerHeaderSelector.js +50 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerHeaderSelector.js.map +1 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerInput.js +16 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerInput.js.map +1 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerTime.js +11 -0
- package/dist/esm/components/DDatePicker/components/DDatePickerTime.js.map +1 -0
- package/dist/esm/components/DDatePicker/index.js +6 -0
- package/dist/esm/components/DDatePicker/index.js.map +1 -0
- package/dist/esm/components/DDropdown/DDropdown.js +315 -0
- package/dist/esm/components/DDropdown/DDropdown.js.map +1 -0
- package/dist/esm/components/DDropdown/index.js +6 -0
- package/dist/esm/components/DDropdown/index.js.map +1 -0
- package/dist/esm/components/DErrorBoundary/DErrorBoundary.js +22 -0
- package/dist/esm/components/DErrorBoundary/DErrorBoundary.js.map +1 -0
- package/dist/esm/components/DErrorBoundary/components/DefaultErrorBoundary.js +10 -0
- package/dist/esm/components/DErrorBoundary/components/DefaultErrorBoundary.js.map +1 -0
- package/dist/esm/components/DErrorBoundary/index.js +7 -0
- package/dist/esm/components/DErrorBoundary/index.js.map +1 -0
- package/dist/esm/components/DIcon/DIcon.js +21 -0
- package/dist/esm/components/DIcon/DIcon.js.map +1 -0
- package/dist/esm/components/DIcon/index.js +6 -0
- package/dist/esm/components/DIcon/index.js.map +1 -0
- package/dist/esm/components/DIconBase/DIconBase.js +146 -0
- package/dist/esm/components/DIconBase/DIconBase.js.map +1 -0
- package/dist/esm/components/DIconBase/index.js +6 -0
- package/dist/esm/components/DIconBase/index.js.map +1 -0
- package/dist/esm/components/DIconBase/resolveIconFromRegistry.js +20 -0
- package/dist/esm/components/DIconBase/resolveIconFromRegistry.js.map +1 -0
- package/dist/esm/components/DIconBase/warnUnknownIcon.js +59 -0
- package/dist/esm/components/DIconBase/warnUnknownIcon.js.map +1 -0
- package/dist/esm/components/DInput/DInput.js +95 -0
- package/dist/esm/components/DInput/DInput.js.map +1 -0
- package/dist/esm/components/DInput/index.js +6 -0
- package/dist/esm/components/DInput/index.js.map +1 -0
- package/dist/esm/components/DInputCheck/DInputCheck.js +94 -0
- package/dist/esm/components/DInputCheck/DInputCheck.js.map +1 -0
- package/dist/esm/components/DInputCheck/index.js +6 -0
- package/dist/esm/components/DInputCheck/index.js.map +1 -0
- package/dist/esm/components/DInputCounter/DInputCounter.js +107 -0
- package/dist/esm/components/DInputCounter/DInputCounter.js.map +1 -0
- package/dist/esm/components/DInputCounter/index.js +6 -0
- package/dist/esm/components/DInputCounter/index.js.map +1 -0
- package/dist/esm/components/DInputCurrency/DInputCurrency.js +25 -0
- package/dist/esm/components/DInputCurrency/DInputCurrency.js.map +1 -0
- package/dist/esm/components/DInputCurrency/index.js +6 -0
- package/dist/esm/components/DInputCurrency/index.js.map +1 -0
- package/dist/esm/components/DInputMask/DInputMask.js +13 -0
- package/dist/esm/components/DInputMask/DInputMask.js.map +1 -0
- package/dist/esm/components/DInputMask/index.js +6 -0
- package/dist/esm/components/DInputMask/index.js.map +1 -0
- package/dist/esm/components/DInputPassword/DInputPassword.js +24 -0
- package/dist/esm/components/DInputPassword/DInputPassword.js.map +1 -0
- package/dist/esm/components/DInputPassword/index.js +6 -0
- package/dist/esm/components/DInputPassword/index.js.map +1 -0
- package/dist/esm/components/DInputPhone/DInputPhone.js +108 -0
- package/dist/esm/components/DInputPhone/DInputPhone.js.map +1 -0
- package/dist/esm/components/DInputPhone/index.js +6 -0
- package/dist/esm/components/DInputPhone/index.js.map +1 -0
- package/dist/esm/components/DInputPin/DInputPin.js +88 -0
- package/dist/esm/components/DInputPin/DInputPin.js.map +1 -0
- package/dist/esm/components/DInputPin/index.js +6 -0
- package/dist/esm/components/DInputPin/index.js.map +1 -0
- package/dist/esm/components/DInputRange/DInputRange.js +60 -0
- package/dist/esm/components/DInputRange/DInputRange.js.map +1 -0
- package/dist/esm/components/DInputRange/index.js +6 -0
- package/dist/esm/components/DInputRange/index.js.map +1 -0
- package/dist/esm/components/DInputSearch/DInputSearch.js +57 -0
- package/dist/esm/components/DInputSearch/DInputSearch.js.map +1 -0
- package/dist/esm/components/DInputSearch/index.js +6 -0
- package/dist/esm/components/DInputSearch/index.js.map +1 -0
- package/dist/esm/components/DInputSelect/DInputSelect.js +104 -0
- package/dist/esm/components/DInputSelect/DInputSelect.js.map +1 -0
- package/dist/esm/components/DInputSelect/index.js +6 -0
- package/dist/esm/components/DInputSelect/index.js.map +1 -0
- package/dist/esm/components/DInputSwitch/DInputSwitch.js +43 -0
- package/dist/esm/components/DInputSwitch/DInputSwitch.js.map +1 -0
- package/dist/esm/components/DInputSwitch/index.js +6 -0
- package/dist/esm/components/DInputSwitch/index.js.map +1 -0
- package/dist/esm/components/DLayout/DLayout.js +22 -0
- package/dist/esm/components/DLayout/DLayout.js.map +1 -0
- package/dist/esm/components/DLayout/components/DLayoutPane.js +16 -0
- package/dist/esm/components/DLayout/components/DLayoutPane.js.map +1 -0
- package/dist/esm/components/DLayout/index.js +7 -0
- package/dist/esm/components/DLayout/index.js.map +1 -0
- package/dist/esm/components/DListGroup/DListGroup.js +39 -0
- package/dist/esm/components/DListGroup/DListGroup.js.map +1 -0
- package/dist/esm/components/DListGroup/ListGroupContext.js +11 -0
- package/dist/esm/components/DListGroup/ListGroupContext.js.map +1 -0
- package/dist/esm/components/DListGroup/components/DListGroupItem.js +59 -0
- package/dist/esm/components/DListGroup/components/DListGroupItem.js.map +1 -0
- package/dist/esm/components/DListGroup/components/warnInvalidListMarkup.js +30 -0
- package/dist/esm/components/DListGroup/components/warnInvalidListMarkup.js.map +1 -0
- package/dist/esm/components/DListGroup/index.js +7 -0
- package/dist/esm/components/DListGroup/index.js.map +1 -0
- package/dist/esm/components/DModal/DModal.js +37 -0
- package/dist/esm/components/DModal/DModal.js.map +1 -0
- package/dist/esm/components/DModal/components/DModalBody.js +9 -0
- package/dist/esm/components/DModal/components/DModalBody.js.map +1 -0
- package/dist/esm/components/DModal/components/DModalFooter.js +14 -0
- package/dist/esm/components/DModal/components/DModalFooter.js.map +1 -0
- package/dist/esm/components/DModal/components/DModalHeader.js +15 -0
- package/dist/esm/components/DModal/components/DModalHeader.js.map +1 -0
- package/dist/esm/components/DModal/index.js +9 -0
- package/dist/esm/components/DModal/index.js.map +1 -0
- package/dist/esm/components/DOffcanvas/DOffcanvas.js +82 -0
- package/dist/esm/components/DOffcanvas/DOffcanvas.js.map +1 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasBody.js +9 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasBody.js.map +1 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasFooter.js +14 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasFooter.js.map +1 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasHeader.js +15 -0
- package/dist/esm/components/DOffcanvas/components/DOffcanvasHeader.js.map +1 -0
- package/dist/esm/components/DOffcanvas/index.js +9 -0
- package/dist/esm/components/DOffcanvas/index.js.map +1 -0
- package/dist/esm/components/DOtp/DOtp.js +26 -0
- package/dist/esm/components/DOtp/DOtp.js.map +1 -0
- package/dist/esm/components/DOtp/components/OtpCountdown.js +12 -0
- package/dist/esm/components/DOtp/components/OtpCountdown.js.map +1 -0
- package/dist/esm/components/DOtp/index.js +6 -0
- package/dist/esm/components/DOtp/index.js.map +1 -0
- package/dist/esm/components/DPaginator/DPaginator.js +12 -0
- package/dist/esm/components/DPaginator/DPaginator.js.map +1 -0
- package/dist/esm/components/DPaginator/index.js +6 -0
- package/dist/esm/components/DPaginator/index.js.map +1 -0
- package/dist/esm/components/DPasswordStrengthMeter/DPasswordStrengthMeter.js +27 -0
- package/dist/esm/components/DPasswordStrengthMeter/DPasswordStrengthMeter.js.map +1 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckItem.js +10 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckItem.js.map +1 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckList.js +41 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordCheckList.js.map +1 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordStrength.js +23 -0
- package/dist/esm/components/DPasswordStrengthMeter/PasswordStrength.js.map +1 -0
- package/dist/esm/components/DPasswordStrengthMeter/index.js +6 -0
- package/dist/esm/components/DPasswordStrengthMeter/index.js.map +1 -0
- package/dist/esm/components/DPopover/DPopover.js +49 -0
- package/dist/esm/components/DPopover/DPopover.js.map +1 -0
- package/dist/esm/components/DPopover/index.js +6 -0
- package/dist/esm/components/DPopover/index.js.map +1 -0
- package/dist/esm/components/DProgress/DProgress.js +22 -0
- package/dist/esm/components/DProgress/DProgress.js.map +1 -0
- package/dist/esm/components/DProgress/index.js +6 -0
- package/dist/esm/components/DProgress/index.js.map +1 -0
- package/dist/esm/components/DSelect/DSelect.js +88 -0
- package/dist/esm/components/DSelect/DSelect.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectClearIndicator.js +12 -0
- package/dist/esm/components/DSelect/components/DSelectClearIndicator.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectDropdownIndicator.js +12 -0
- package/dist/esm/components/DSelect/components/DSelectDropdownIndicator.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectLoadingIndicator.js +12 -0
- package/dist/esm/components/DSelect/components/DSelectLoadingIndicator.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectMultiValueRemove.js +12 -0
- package/dist/esm/components/DSelect/components/DSelectMultiValueRemove.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectOptionCheck.js +14 -0
- package/dist/esm/components/DSelect/components/DSelectOptionCheck.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectOptionEmoji.js +14 -0
- package/dist/esm/components/DSelect/components/DSelectOptionEmoji.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectOptionIcon.js +15 -0
- package/dist/esm/components/DSelect/components/DSelectOptionIcon.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectPlaceholder.js +14 -0
- package/dist/esm/components/DSelect/components/DSelectPlaceholder.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueEmoji.js +15 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueEmoji.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueEmojiText.js +15 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueEmojiText.js.map +1 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueIconText.js +16 -0
- package/dist/esm/components/DSelect/components/DSelectSingleValueIconText.js.map +1 -0
- package/dist/esm/components/DSelect/createAriaGuidance.js +57 -0
- package/dist/esm/components/DSelect/createAriaGuidance.js.map +1 -0
- package/dist/esm/components/DSelect/index.js +6 -0
- package/dist/esm/components/DSelect/index.js.map +1 -0
- package/dist/esm/components/DStepper/DStepper.js +13 -0
- package/dist/esm/components/DStepper/DStepper.js.map +1 -0
- package/dist/esm/components/DStepper/index.js +6 -0
- package/dist/esm/components/DStepper/index.js.map +1 -0
- package/dist/esm/components/DStepperDesktop/DStepperDesktop.js +27 -0
- package/dist/esm/components/DStepperDesktop/DStepperDesktop.js.map +1 -0
- package/dist/esm/components/DStepperDesktop/index.js +6 -0
- package/dist/esm/components/DStepperDesktop/index.js.map +1 -0
- package/dist/esm/components/DStepperMobile/DStepperMobile.js +37 -0
- package/dist/esm/components/DStepperMobile/DStepperMobile.js.map +1 -0
- package/dist/esm/components/DStepperMobile/index.js +6 -0
- package/dist/esm/components/DStepperMobile/index.js.map +1 -0
- package/dist/esm/components/DTabs/DTabs.js +106 -0
- package/dist/esm/components/DTabs/DTabs.js.map +1 -0
- package/dist/esm/components/DTabs/TabContext.js +14 -0
- package/dist/esm/components/DTabs/TabContext.js.map +1 -0
- package/dist/esm/components/DTabs/components/DTabContent.js +14 -0
- package/dist/esm/components/DTabs/components/DTabContent.js.map +1 -0
- package/dist/esm/components/DTabs/components/DTabsProvider.js +22 -0
- package/dist/esm/components/DTabs/components/DTabsProvider.js.map +1 -0
- package/dist/esm/components/DTabs/index.js +9 -0
- package/dist/esm/components/DTabs/index.js.map +1 -0
- package/dist/esm/components/DTimeline/DTimeline.js +12 -0
- package/dist/esm/components/DTimeline/DTimeline.js.map +1 -0
- package/dist/esm/components/DTimeline/index.js +6 -0
- package/dist/esm/components/DTimeline/index.js.map +1 -0
- package/dist/esm/components/DToast/DToast.js +20 -0
- package/dist/esm/components/DToast/DToast.js.map +1 -0
- package/dist/esm/components/DToast/components/DToastBody.js +9 -0
- package/dist/esm/components/DToast/components/DToastBody.js.map +1 -0
- package/dist/esm/components/DToast/components/DToastHeader.js +9 -0
- package/dist/esm/components/DToast/components/DToastHeader.js.map +1 -0
- package/dist/esm/components/DToast/index.js +8 -0
- package/dist/esm/components/DToast/index.js.map +1 -0
- package/dist/esm/components/DToastContainer/DToastContainer.js +9 -0
- package/dist/esm/components/DToastContainer/DToastContainer.js.map +1 -0
- package/dist/esm/components/DToastContainer/index.js +7 -0
- package/dist/esm/components/DToastContainer/index.js.map +1 -0
- package/dist/esm/components/DToastContainer/useDToast.js +58 -0
- package/dist/esm/components/DToastContainer/useDToast.js.map +1 -0
- package/dist/esm/components/DTooltip/DTooltip.js +51 -0
- package/dist/esm/components/DTooltip/DTooltip.js.map +1 -0
- package/dist/esm/components/DTooltip/index.js +6 -0
- package/dist/esm/components/DTooltip/index.js.map +1 -0
- package/dist/esm/components/DVoucher/DVoucher.js +55 -0
- package/dist/esm/components/DVoucher/DVoucher.js.map +1 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshot.js +30 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshot.js.map +1 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshotDownload.js +30 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshotDownload.js.map +1 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshotWebShare.js +27 -0
- package/dist/esm/components/DVoucher/hooks/useScreenshotWebShare.js.map +1 -0
- package/dist/esm/components/DVoucher/index.js +9 -0
- package/dist/esm/components/DVoucher/index.js.map +1 -0
- package/dist/esm/components/config.js +14 -0
- package/dist/esm/components/config.js.map +1 -0
- package/dist/esm/components/internal/DFormLabel.js +46 -0
- package/dist/esm/components/internal/DFormLabel.js.map +1 -0
- package/dist/esm/contexts/DContext.js +124 -0
- package/dist/esm/contexts/DContext.js.map +1 -0
- package/dist/esm/contexts/DPortalContext.js +163 -0
- package/dist/esm/contexts/DPortalContext.js.map +1 -0
- package/dist/esm/contexts/portal/DPortalStack.js +12 -0
- package/dist/esm/contexts/portal/DPortalStack.js.map +1 -0
- package/dist/esm/hooks/useConfirmModal.js +63 -0
- package/dist/esm/hooks/useConfirmModal.js.map +1 -0
- package/dist/esm/hooks/useControlledState.js +51 -0
- package/dist/esm/hooks/useControlledState.js.map +1 -0
- package/dist/esm/hooks/useCountdown.js +45 -0
- package/dist/esm/hooks/useCountdown.js.map +1 -0
- package/dist/esm/hooks/useDisableBodyScrollEffect.js +52 -0
- package/dist/esm/hooks/useDisableBodyScrollEffect.js.map +1 -0
- package/dist/esm/hooks/useDisableInputWheel.js +17 -0
- package/dist/esm/hooks/useDisableInputWheel.js.map +1 -0
- package/dist/esm/hooks/useFormatCurrency.js +16 -0
- package/dist/esm/hooks/useFormatCurrency.js.map +1 -0
- package/dist/esm/hooks/useInputCurrency.js +130 -0
- package/dist/esm/hooks/useInputCurrency.js.map +1 -0
- package/dist/esm/hooks/useItemSelection.js +35 -0
- package/dist/esm/hooks/useItemSelection.js.map +1 -0
- package/dist/esm/hooks/useMediaBreakpointUp.js +69 -0
- package/dist/esm/hooks/useMediaBreakpointUp.js.map +1 -0
- package/dist/esm/hooks/useMediaQuery.js +11 -0
- package/dist/esm/hooks/useMediaQuery.js.map +1 -0
- package/dist/esm/hooks/useOtp.js +107 -0
- package/dist/esm/hooks/useOtp.js.map +1 -0
- package/dist/esm/hooks/usePortal.js +26 -0
- package/dist/esm/hooks/usePortal.js.map +1 -0
- package/dist/esm/hooks/useProvidedRefOrCreate.js +24 -0
- package/dist/esm/hooks/useProvidedRefOrCreate.js.map +1 -0
- package/dist/esm/hooks/useResponsiveProp.js +61 -0
- package/dist/esm/hooks/useResponsiveProp.js.map +1 -0
- package/dist/esm/hooks/useStackState.js +40 -0
- package/dist/esm/hooks/useStackState.js.map +1 -0
- package/dist/esm/icons/coreIcons.js +55 -0
- package/dist/esm/icons/coreIcons.js.map +1 -0
- package/dist/esm/index.js +99 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/utils/attr-accept.js +38 -0
- package/dist/esm/utils/attr-accept.js.map +1 -0
- package/dist/esm/utils/buildUrl.js +57 -0
- package/dist/esm/utils/buildUrl.js.map +1 -0
- package/dist/esm/utils/changeQueryString.js +19 -0
- package/dist/esm/utils/changeQueryString.js.map +1 -0
- package/dist/esm/utils/configureI18n.js +20 -0
- package/dist/esm/utils/configureI18n.js.map +1 -0
- package/dist/esm/utils/formatCurrency.js +8 -0
- package/dist/esm/utils/formatCurrency.js.map +1 -0
- package/dist/esm/utils/getCssVariable.js +7 -0
- package/dist/esm/utils/getCssVariable.js.map +1 -0
- package/dist/esm/utils/getKeyboardFocusableElements.js +11 -0
- package/dist/esm/utils/getKeyboardFocusableElements.js.map +1 -0
- package/dist/esm/utils/getQueryString.js +8 -0
- package/dist/esm/utils/getQueryString.js.map +1 -0
- package/dist/esm/utils/hasLabelContent.js +48 -0
- package/dist/esm/utils/hasLabelContent.js.map +1 -0
- package/dist/esm/utils/isTextLabel.js +23 -0
- package/dist/esm/utils/isTextLabel.js.map +1 -0
- package/dist/esm/utils/labelClickGuard.js +61 -0
- package/dist/esm/utils/labelClickGuard.js.map +1 -0
- package/dist/esm/utils/mediaQuery.js +13 -0
- package/dist/esm/utils/mediaQuery.js.map +1 -0
- package/dist/esm/utils/sanitizeHref.js +67 -0
- package/dist/esm/utils/sanitizeHref.js.map +1 -0
- package/dist/esm/utils/validatePhoneNumber.js +14 -0
- package/dist/esm/utils/validatePhoneNumber.js.map +1 -0
- package/dist/esm/utils/warnLabelUsage.js +57 -0
- package/dist/esm/utils/warnLabelUsage.js.map +1 -0
- package/dist/icons-core.json +33 -0
- package/dist/index.esm.js +1151 -184
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1151 -182
- package/dist/index.js.map +1 -1
- package/dist/types/components/DAlert/DAlert.d.ts +16 -2
- package/dist/types/components/DButtonIcon/DButtonIcon.d.ts +9 -1
- package/dist/types/components/DButtonIcon/warnMissingAccessibleName.d.ts +18 -0
- package/dist/types/components/DDataStateWrapper/DDataStateWrapper.d.ts +29 -4
- package/dist/types/components/DDataStateWrapper/index.d.ts +1 -1
- package/dist/types/components/DErrorBoundary/DErrorBoundary.d.ts +6 -1
- package/dist/types/components/DErrorBoundary/components/DefaultErrorBoundary.d.ts +3 -1
- package/dist/types/components/DIcon/DIcon.d.ts +8 -0
- package/dist/types/components/DIconBase/DIconBase.d.ts +43 -1
- package/dist/types/components/DIconBase/resolveIconFromRegistry.d.ts +14 -0
- package/dist/types/components/DIconBase/warnUnknownIcon.d.ts +13 -0
- package/dist/types/components/DInput/DInput.d.ts +11 -2
- package/dist/types/components/DInputCheck/DInputCheck.d.ts +28 -3
- package/dist/types/components/DInputCounter/DInputCounter.d.ts +15 -3
- package/dist/types/components/DInputCurrency/DInputCurrency.d.ts +10 -3
- package/dist/types/components/DInputPhone/DInputPhone.d.ts +11 -2
- package/dist/types/components/DInputPin/DInputPin.d.ts +12 -2
- package/dist/types/components/DInputRange/DInputRange.d.ts +16 -3
- package/dist/types/components/DInputSelect/DInputSelect.d.ts +18 -3
- package/dist/types/components/DInputSwitch/DInputSwitch.d.ts +28 -3
- package/dist/types/components/DListGroup/DListGroup.d.ts +12 -1
- package/dist/types/components/DListGroup/ListGroupContext.d.ts +8 -0
- package/dist/types/components/DListGroup/components/DListGroupItem.d.ts +6 -1
- package/dist/types/components/DListGroup/components/warnInvalidListMarkup.d.ts +13 -0
- package/dist/types/components/DPasswordStrengthMeter/DPasswordStrengthMeter.d.ts +18 -3
- package/dist/types/components/DProgress/DProgress.d.ts +13 -1
- package/dist/types/components/DSelect/DSelect.d.ts +23 -3
- package/dist/types/components/DSelect/createAriaGuidance.d.ts +21 -0
- package/dist/types/components/DTabs/DTabs.d.ts +13 -2
- package/dist/types/components/DTabs/TabContext.d.ts +5 -0
- package/dist/types/components/DTabs/components/DTabsProvider.d.ts +11 -0
- package/dist/types/components/DTabs/index.d.ts +1 -0
- package/dist/types/components/DToast/DToast.d.ts +10 -3
- package/dist/types/components/DToastContainer/useDToast.d.ts +8 -1
- package/dist/types/components/config.d.ts +10 -0
- package/dist/types/components/index.d.ts +2 -2
- package/dist/types/components/interface.d.ts +7 -0
- package/dist/types/components/internal/DFormLabel.d.ts +30 -0
- package/dist/types/contexts/portal/DPortalStack.d.ts +13 -0
- package/dist/types/hooks/useControlledState.d.ts +17 -0
- package/dist/types/hooks/useInputCurrency.d.ts +26 -1
- package/dist/types/hooks/useMediaBreakpointUp.d.ts +10 -0
- package/dist/types/icons/coreIcons.d.ts +24 -0
- package/dist/types/icons/index.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/utils/hasLabelContent.d.ts +30 -0
- package/dist/types/utils/isTextLabel.d.ts +17 -0
- package/dist/types/utils/labelClickGuard.d.ts +20 -0
- package/dist/types/utils/warnLabelUsage.d.ts +43 -0
- package/package.json +10 -5
- package/src/style/abstracts/variables/_body.scss +2 -2
- package/src/style/abstracts/variables/_chips.scss +2 -0
- package/src/style/abstracts/variables/_colors.scss +2 -2
- package/src/style/base/_buttons.scss +4 -1
- package/src/style/base/_input-group.scss +5 -2
- package/src/style/base/_list-group.scss +55 -0
- package/src/style/components/_d-chip.scss +7 -2
- package/src/style/components/_d-tabs.scss +3 -0
- package/src/style/helpers/_color-bg.scss +5 -0
- package/src/style/root/_root.scss +9 -0
- package/dist/types/components/DVoucher/hooks/useScreenshotDownload.spec.d.ts +0 -1
- package/dist/types/components/DVoucher/hooks/useScreenshotWebShare.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useCountdown.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useDisableBodyScrollEffect.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useDisableInputWheel.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useFormatCurrency.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useInputCurrency.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useItemSelection.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useMediaBreakpointUp.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useMediaQuery.spec.d.ts +0 -1
- package/dist/types/hooks/tests/usePortal.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useProvidedRefOrCreate.spec.d.ts +0 -1
- package/dist/types/hooks/tests/useStackState.spec.d.ts +0 -1
- package/dist/types/utils/tests/attr-accept.spec.d.ts +0 -1
- package/dist/types/utils/tests/buildUrl.spec.d.ts +0 -1
- package/dist/types/utils/tests/changeQueryString.spec.d.ts +0 -1
- package/dist/types/utils/tests/configureI18n.spec.d.ts +0 -1
- package/dist/types/utils/tests/formatCurrency.spec.d.ts +0 -1
- package/dist/types/utils/tests/getCssVariable.spec.d.ts +0 -1
- package/dist/types/utils/tests/getKeyboardFocusableElements.spec.d.ts +0 -1
- package/dist/types/utils/tests/getQueryString.spec.d.ts +0 -1
- package/dist/types/utils/tests/mediaQuery.spec.d.ts +0 -1
- package/dist/types/utils/tests/sanitizeHref.spec.d.ts +0 -1
- package/dist/types/utils/tests/validatePhoneNumber.spec.d.ts +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DPortalContext.js","sources":["../../../dist-transpiled/contexts/DPortalContext.js"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';\nimport { createPortal } from 'react-dom';\nimport useDisableBodyScrollEffect from '../hooks/useDisableBodyScrollEffect';\nimport usePortal from '../hooks/usePortal';\nimport useStackState from '../hooks/useStackState';\nimport getKeyboardFocusableElements from '../utils/getKeyboardFocusableElements';\nconst loadPortalStack = () => import('./portal/DPortalStack').then((module) => module.default);\nexport const DPortalContext = createContext(undefined);\nexport function DPortalContextProvider({ portalName, children, availablePortals, }) {\n const { created } = usePortal(portalName);\n const [stack, { push, pop }] = useStackState([]);\n const [PortalStack, setPortalStack] = useState(null);\n const pending = useRef([]);\n const ready = useRef(false);\n useDisableBodyScrollEffect(Boolean(stack.length));\n // Loads framer-motion off the critical path only when portals are configured,\n // so the first openPortal does not wait for it.\n const hasPortals = Object.keys(availablePortals !== null && availablePortals !== void 0 ? availablePortals : {}).length > 0;\n useEffect(() => {\n if (!hasPortals)\n return;\n loadPortalStack()\n .then((Stack) => {\n ready.current = true;\n setPortalStack(() => Stack);\n })\n .catch(() => {\n // openPortal retries the import and reports the failure.\n });\n }, [hasPortals]);\n const openPortal = useCallback(\n // eslint-disable-next-line prefer-arrow-callback\n function openPortalImpl(name, payload) {\n var _a;\n if (!availablePortals) {\n throw new Error('openPortal was called but DContextProvider has no availablePortals configured. '\n + 'Pass an availablePortals map to DContextProvider.');\n }\n const Component = availablePortals[name];\n if (!Component) {\n throw new Error(`No component registered for portal \"${String(name)}\". `\n + `Ensure \"${String(name)}\" has an entry in the availablePortals map on DContextProvider.`);\n }\n // K is a specific member of keyof T & string so the object satisfies\n // InternalStackItem<T>, but TS can't verify generic-over-union assignability.\n const item = { name, Component, payload };\n if (ready.current) {\n push(item);\n }\n else {\n // Not loaded yet: the portal enters the stack together with its renderer.\n pending.current.push(item);\n loadPortalStack().then((Stack) => {\n ready.current = true;\n setPortalStack(() => Stack);\n pending.current.splice(0).forEach(push);\n }).catch((error) => {\n pending.current = [];\n // eslint-disable-next-line no-console\n console.error('[DPortalContext] Could not load the portal stack', error);\n });\n }\n (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.blur();\n }, [availablePortals, push]);\n const closePortal = useCallback(() => {\n if (pending.current.length > 0) {\n pending.current.pop();\n return;\n }\n // pop() is safe on empty stacks, so close remains idempotent.\n pop();\n }, [pop]);\n const publicStack = useMemo(() => stack.map(({ name, payload }) => ({ name, payload })), [stack]);\n const value = useMemo(() => ({\n stack: publicStack,\n openPortal,\n closePortal,\n }), [publicStack, openPortal, closePortal]);\n const handleClose = useCallback((target) => {\n if (!(target instanceof HTMLDivElement)) {\n return;\n }\n if (target.classList.contains('portal') && !('bsBackdrop' in target.dataset)) {\n closePortal();\n return;\n }\n if (target.classList.contains('backdrop')) {\n const lastPortal = target.nextElementSibling;\n if (lastPortal && lastPortal.classList.contains('portal') && !('bsBackdrop' in lastPortal.dataset)) {\n closePortal();\n }\n }\n }, [closePortal]);\n useEffect(() => {\n const keyEvent = (event) => {\n const lastPortal = document.querySelector(`#${portalName} > div > div:last-child`);\n if (event.key === 'Escape') {\n if (lastPortal) {\n handleClose(lastPortal);\n return;\n }\n }\n if (event.key === 'Tab') {\n const focusableElements = getKeyboardFocusableElements(lastPortal);\n if (focusableElements.length === 0)\n return;\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n if (stack.length !== 0) {\n window.addEventListener('keydown', keyEvent);\n }\n return () => {\n window.removeEventListener('keydown', keyEvent);\n };\n }, [handleClose, portalName, stack.length]);\n return (_jsxs(DPortalContext.Provider, { value: value, children: [children, created && PortalStack && createPortal(\n // eslint-disable-next-line max-len\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n _jsx(\"div\", { onClick: ({ target }) => handleClose(target), onKeyDown: () => { }, children: _jsx(PortalStack, { stack: stack }) }), document.getElementById(portalName))] }));\n}\n/**\n * Hook to open/close registered portals (modals, offcanvas, etc.).\n *\n * **Prerequisite**: must be called inside a `DContextProvider` configured with\n * `portalName` and `availablePortals`. `DContextProvider` mounts\n * `DPortalContextProvider` internally — consumers never use\n * `DPortalContextProvider` directly.\n *\n * @template T - Map of portal name → payload shape (e.g. `ModalPayloads`).\n * Typing this generic gives you autocomplete on `openPortal` arguments.\n * @returns `{ openPortal, closePortal, stack }` from the nearest portal context.\n * @throws If called outside of `DContextProvider` / `DPortalContextProvider`.\n *\n * @requires DContextProvider\n *\n * @example\n * ```tsx\n * const { openPortal, closePortal } = useDPortalContext<ModalPayloads>();\n * openPortal('confirm', { message: 'Are you sure?' });\n * ```\n */\nexport function useDPortalContext() {\n const context = useContext(DPortalContext);\n if (context === undefined) {\n throw new Error('useDPortalContext was used outside of DPortalContextProvider');\n }\n return context;\n}\n//# sourceMappingURL=DPortalContext.js.map"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { AnimatePresence, motion } from 'framer-motion';
|
|
3
|
+
|
|
4
|
+
function DPortalStack({ stack }) {
|
|
5
|
+
return (jsx(AnimatePresence, { children: stack.flatMap(({ Component, name, payload, }) => [
|
|
6
|
+
jsx(motion.div, { className: "backdrop", initial: { opacity: 0 }, animate: { opacity: 0.5 }, exit: { opacity: 0, transition: { delay: 0.3 } }, transition: { duration: 0.15, ease: 'linear' } }, `${name}-backdrop`),
|
|
7
|
+
jsx(Component, { name: name, payload: payload }, name),
|
|
8
|
+
]) }));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { DPortalStack as default };
|
|
12
|
+
//# sourceMappingURL=DPortalStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DPortalStack.js","sources":["../../../../dist-transpiled/contexts/portal/DPortalStack.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AnimatePresence, motion } from 'framer-motion';\nexport default function DPortalStack({ stack }) {\n return (_jsx(AnimatePresence, { children: stack.flatMap(({ Component, name, payload, }) => [\n _jsx(motion.div, { className: \"backdrop\", initial: { opacity: 0 }, animate: { opacity: 0.5 }, exit: { opacity: 0, transition: { delay: 0.3 } }, transition: { duration: 0.15, ease: 'linear' } }, `${name}-backdrop`),\n _jsx(Component, { name: name, payload: payload }, name),\n ]) }));\n}\n//# sourceMappingURL=DPortalStack.js.map"],"names":["_jsx"],"mappings":";;;AAGe,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;AAChD,IAAI,QAAQA,GAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;AAC/F,YAAYA,GAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACjO,YAAYA,GAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC;AACnE,SAAS,CAAC,EAAE,CAAC;AACb;;;;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useRef, useCallback } from 'react';
|
|
2
|
+
import { useConfirmModalStore } from '../components/DConfirmModal/confirmModalStore.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to display a confirmation modal.
|
|
6
|
+
*
|
|
7
|
+
* Renders into the portal node specified by `DConfirmModalContainer` (typically `#d-portal`).
|
|
8
|
+
* The confirm modal floats above the portal stack and handles its own Escape key,
|
|
9
|
+
* preventing interference with underlying modals.
|
|
10
|
+
*
|
|
11
|
+
* Requires both `DContextProvider` wrapping your application AND an explicit
|
|
12
|
+
* `<DConfirmModalContainer nodeId="d-portal" />` mounted in your app.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* function App() {
|
|
16
|
+
* return (
|
|
17
|
+
* <DContextProvider>
|
|
18
|
+
* <YourContent />
|
|
19
|
+
* <DConfirmModalContainer nodeId="d-portal" />
|
|
20
|
+
* </DContextProvider>
|
|
21
|
+
* );
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* function MyComponent() {
|
|
25
|
+
* const confirm = useConfirmModal({
|
|
26
|
+
* title: 'Delete Account',
|
|
27
|
+
* message: 'This action cannot be undone.',
|
|
28
|
+
* critical: { code: 'DELETE ACCOUNT' },
|
|
29
|
+
* onConfirm: async () => { await deleteAccount(); },
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* return <DButton onClick={confirm.open} text="Delete" color="danger" />;
|
|
33
|
+
* }
|
|
34
|
+
*/
|
|
35
|
+
function useConfirmModal(config) {
|
|
36
|
+
const store = useConfirmModalStore();
|
|
37
|
+
const idRef = useRef(`confirm-modal-${Math.random().toString(36).slice(2)}`);
|
|
38
|
+
const close = useCallback(() => {
|
|
39
|
+
store.remove(idRef.current);
|
|
40
|
+
queueMicrotask(() => {
|
|
41
|
+
var _a;
|
|
42
|
+
(_a = config.onClose) === null || _a === void 0 ? void 0 : _a.call(config);
|
|
43
|
+
});
|
|
44
|
+
}, [store, config]);
|
|
45
|
+
const open = useCallback(() => {
|
|
46
|
+
const handleConfirmAction = async () => {
|
|
47
|
+
try {
|
|
48
|
+
await config.onConfirm();
|
|
49
|
+
store.remove(idRef.current);
|
|
50
|
+
}
|
|
51
|
+
catch (_a) {
|
|
52
|
+
// Keep modal open on error
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
// Remove any existing entry with this id to prevent duplicates on re-entrancy
|
|
56
|
+
store.remove(idRef.current);
|
|
57
|
+
store.push(Object.assign(Object.assign({}, config), { id: idRef.current, onConfirmAction: handleConfirmAction, onCloseAction: close }));
|
|
58
|
+
}, [store, config, close]);
|
|
59
|
+
return { open };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { useConfirmModal as default };
|
|
63
|
+
//# sourceMappingURL=useConfirmModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfirmModal.js","sources":["../../../dist-transpiled/hooks/useConfirmModal.js"],"sourcesContent":["import { useCallback, useRef } from 'react';\nimport { useConfirmModalStore } from '../components/DConfirmModal/confirmModalStore';\n/**\n * Hook to display a confirmation modal.\n *\n * Renders into the portal node specified by `DConfirmModalContainer` (typically `#d-portal`).\n * The confirm modal floats above the portal stack and handles its own Escape key,\n * preventing interference with underlying modals.\n *\n * Requires both `DContextProvider` wrapping your application AND an explicit\n * `<DConfirmModalContainer nodeId=\"d-portal\" />` mounted in your app.\n *\n * @example\n * function App() {\n * return (\n * <DContextProvider>\n * <YourContent />\n * <DConfirmModalContainer nodeId=\"d-portal\" />\n * </DContextProvider>\n * );\n * }\n *\n * function MyComponent() {\n * const confirm = useConfirmModal({\n * title: 'Delete Account',\n * message: 'This action cannot be undone.',\n * critical: { code: 'DELETE ACCOUNT' },\n * onConfirm: async () => { await deleteAccount(); },\n * });\n *\n * return <DButton onClick={confirm.open} text=\"Delete\" color=\"danger\" />;\n * }\n */\nexport default function useConfirmModal(config) {\n const store = useConfirmModalStore();\n const idRef = useRef(`confirm-modal-${Math.random().toString(36).slice(2)}`);\n const close = useCallback(() => {\n store.remove(idRef.current);\n queueMicrotask(() => {\n var _a;\n (_a = config.onClose) === null || _a === void 0 ? void 0 : _a.call(config);\n });\n }, [store, config]);\n const open = useCallback(() => {\n const handleConfirmAction = async () => {\n try {\n await config.onConfirm();\n store.remove(idRef.current);\n }\n catch (_a) {\n // Keep modal open on error\n }\n };\n // Remove any existing entry with this id to prevent duplicates on re-entrancy\n store.remove(idRef.current);\n store.push(Object.assign(Object.assign({}, config), { id: idRef.current, onConfirmAction: handleConfirmAction, onCloseAction: close }));\n }, [store, config, close]);\n return { open };\n}\n//# sourceMappingURL=useConfirmModal.js.map"],"names":[],"mappings":";;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,eAAe,CAAC,MAAM,EAAE;AAChD,IAAI,MAAM,KAAK,GAAG,oBAAoB,EAAE;AACxC,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,IAAI,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM;AACpC,QAAQ,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AACnC,QAAQ,cAAc,CAAC,MAAM;AAC7B,YAAY,IAAI,EAAE;AAClB,YAAY,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;AACtF,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvB,IAAI,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM;AACnC,QAAQ,MAAM,mBAAmB,GAAG,YAAY;AAChD,YAAY,IAAI;AAChB,gBAAgB,MAAM,MAAM,CAAC,SAAS,EAAE;AACxC,gBAAgB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AAC3C,YAAY;AACZ,YAAY,OAAO,EAAE,EAAE;AACvB;AACA,YAAY;AACZ,QAAQ,CAAC;AACT;AACA,QAAQ,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;AACnC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/I,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9B,IAAI,OAAO,EAAE,IAAI,EAAE;AACnB;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Backs a value that the consumer may or may not drive, so a control works in
|
|
5
|
+
* both modes without a copy of the state drifting away from the props.
|
|
6
|
+
*
|
|
7
|
+
* A control counts as controlled only when the consumer passes the value *and*
|
|
8
|
+
* an `onChange` to push it back. The value on its own has always meant "start
|
|
9
|
+
* here" in this library — `<DInputCheck type="radio" checked />` inside a radio
|
|
10
|
+
* group, for one — so treating it as controlled would silently freeze those
|
|
11
|
+
* controls, and React emits no warning to say why: the components always attach
|
|
12
|
+
* their own `onChange` handler.
|
|
13
|
+
*
|
|
14
|
+
* @param value the value coming from props, or `undefined` when not passed.
|
|
15
|
+
* @param isControlled whether the consumer can drive the value back.
|
|
16
|
+
* @param initialValue what to start from when no value is passed.
|
|
17
|
+
* @returns the value to render, and a setter to call on every user change.
|
|
18
|
+
*/
|
|
19
|
+
function useControlledState(value, isControlled, initialValue) {
|
|
20
|
+
const [internalValue, setInternalValue] = useState(value === undefined ? initialValue : value);
|
|
21
|
+
// The internal copy follows `value` in both modes.
|
|
22
|
+
//
|
|
23
|
+
// Uncontrolled, `value` without an `onChange` still means "start here", and a
|
|
24
|
+
// later flip of it from outside must still land — but between flips the
|
|
25
|
+
// control has to keep moving on its own, which is why this depends on `value`
|
|
26
|
+
// alone and not on `internalValue`.
|
|
27
|
+
//
|
|
28
|
+
// Controlled, the copy is not what gets rendered, but it is what the control
|
|
29
|
+
// falls back to if the consumer later stops passing a value — `value={locked
|
|
30
|
+
// ? undefined : x}`, say. Keeping it current means that hand-off carries on
|
|
31
|
+
// from where the control is instead of snapping back to the mount-time seed.
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (value === undefined) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setInternalValue(value);
|
|
37
|
+
}, [value]);
|
|
38
|
+
const setValue = useCallback((next) => {
|
|
39
|
+
if (isControlled) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setInternalValue(next);
|
|
43
|
+
}, [isControlled]);
|
|
44
|
+
return [
|
|
45
|
+
isControlled && value !== undefined ? value : internalValue,
|
|
46
|
+
setValue,
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { useControlledState as default };
|
|
51
|
+
//# sourceMappingURL=useControlledState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useControlledState.js","sources":["../../../dist-transpiled/hooks/useControlledState.js"],"sourcesContent":["import { useCallback, useEffect, useState, } from 'react';\n/**\n * Backs a value that the consumer may or may not drive, so a control works in\n * both modes without a copy of the state drifting away from the props.\n *\n * A control counts as controlled only when the consumer passes the value *and*\n * an `onChange` to push it back. The value on its own has always meant \"start\n * here\" in this library — `<DInputCheck type=\"radio\" checked />` inside a radio\n * group, for one — so treating it as controlled would silently freeze those\n * controls, and React emits no warning to say why: the components always attach\n * their own `onChange` handler.\n *\n * @param value the value coming from props, or `undefined` when not passed.\n * @param isControlled whether the consumer can drive the value back.\n * @param initialValue what to start from when no value is passed.\n * @returns the value to render, and a setter to call on every user change.\n */\nexport default function useControlledState(value, isControlled, initialValue) {\n const [internalValue, setInternalValue] = useState(value === undefined ? initialValue : value);\n // The internal copy follows `value` in both modes.\n //\n // Uncontrolled, `value` without an `onChange` still means \"start here\", and a\n // later flip of it from outside must still land — but between flips the\n // control has to keep moving on its own, which is why this depends on `value`\n // alone and not on `internalValue`.\n //\n // Controlled, the copy is not what gets rendered, but it is what the control\n // falls back to if the consumer later stops passing a value — `value={locked\n // ? undefined : x}`, say. Keeping it current means that hand-off carries on\n // from where the control is instead of snapping back to the mount-time seed.\n useEffect(() => {\n if (value === undefined) {\n return;\n }\n setInternalValue(value);\n }, [value]);\n const setValue = useCallback((next) => {\n if (isControlled) {\n return;\n }\n setInternalValue(next);\n }, [isControlled]);\n return [\n isControlled && value !== undefined ? value : internalValue,\n setValue,\n ];\n}\n//# sourceMappingURL=useControlledState.js.map"],"names":[],"mappings":";;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE;AAC9E,IAAI,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,KAAK,SAAS,GAAG,YAAY,GAAG,KAAK,CAAC;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,SAAS,CAAC,MAAM;AACpB,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE;AACjC,YAAY;AACZ,QAAQ;AACR,QAAQ,gBAAgB,CAAC,KAAK,CAAC;AAC/B,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACf,IAAI,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAI,KAAK;AAC3C,QAAQ,IAAI,YAAY,EAAE;AAC1B,YAAY;AACZ,QAAQ;AACR,QAAQ,gBAAgB,CAAC,IAAI,CAAC;AAC9B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AACtB,IAAI,OAAO;AACX,QAAQ,YAAY,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,aAAa;AACnE,QAAQ,QAAQ;AAChB,KAAK;AACL;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic seconds-based countdown hook.
|
|
5
|
+
*
|
|
6
|
+
* Starts counting down from `seconds` to `0` and exposes `restartCountdown`
|
|
7
|
+
* to reset and restart the timer (e.g. for "resend code in Xs" patterns,
|
|
8
|
+
* session-expiry banners, or any other cooldown/throttle UI).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const { secondsLeft, restartCountdown } = useCountdown(30);
|
|
12
|
+
*/
|
|
13
|
+
function useCountdown(seconds) {
|
|
14
|
+
const [secondsLeft, setSecondsLeft] = useState(seconds);
|
|
15
|
+
const [isActive, setIsActive] = useState(true);
|
|
16
|
+
const resetCountdown = useCallback((newSeconds = seconds) => {
|
|
17
|
+
setIsActive(false);
|
|
18
|
+
setSecondsLeft(newSeconds);
|
|
19
|
+
}, [seconds]);
|
|
20
|
+
const restartCountdown = useCallback(() => {
|
|
21
|
+
resetCountdown(seconds);
|
|
22
|
+
setIsActive(true);
|
|
23
|
+
}, [resetCountdown, seconds]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!isActive) {
|
|
26
|
+
return () => { };
|
|
27
|
+
}
|
|
28
|
+
const interval = setInterval(() => {
|
|
29
|
+
setSecondsLeft((prevSeconds) => {
|
|
30
|
+
const newSeconds = prevSeconds - 1;
|
|
31
|
+
if (newSeconds <= 0) {
|
|
32
|
+
clearInterval(interval);
|
|
33
|
+
setIsActive(false);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
return newSeconds;
|
|
37
|
+
});
|
|
38
|
+
}, 1000);
|
|
39
|
+
return () => clearInterval(interval);
|
|
40
|
+
}, [isActive]);
|
|
41
|
+
return { secondsLeft, restartCountdown };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { useCountdown as default };
|
|
45
|
+
//# sourceMappingURL=useCountdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCountdown.js","sources":["../../../dist-transpiled/hooks/useCountdown.js"],"sourcesContent":["import { useState, useEffect, useCallback, } from 'react';\n/**\n * Generic seconds-based countdown hook.\n *\n * Starts counting down from `seconds` to `0` and exposes `restartCountdown`\n * to reset and restart the timer (e.g. for \"resend code in Xs\" patterns,\n * session-expiry banners, or any other cooldown/throttle UI).\n *\n * @example\n * const { secondsLeft, restartCountdown } = useCountdown(30);\n */\nexport default function useCountdown(seconds) {\n const [secondsLeft, setSecondsLeft] = useState(seconds);\n const [isActive, setIsActive] = useState(true);\n const resetCountdown = useCallback((newSeconds = seconds) => {\n setIsActive(false);\n setSecondsLeft(newSeconds);\n }, [seconds]);\n const restartCountdown = useCallback(() => {\n resetCountdown(seconds);\n setIsActive(true);\n }, [resetCountdown, seconds]);\n useEffect(() => {\n if (!isActive) {\n return () => { };\n }\n const interval = setInterval(() => {\n setSecondsLeft((prevSeconds) => {\n const newSeconds = prevSeconds - 1;\n if (newSeconds <= 0) {\n clearInterval(interval);\n setIsActive(false);\n return 0;\n }\n return newSeconds;\n });\n }, 1000);\n return () => clearInterval(interval);\n }, [isActive]);\n return { secondsLeft, restartCountdown };\n}\n//# sourceMappingURL=useCountdown.js.map"],"names":[],"mappings":";;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAAS,YAAY,CAAC,OAAO,EAAE;AAC9C,IAAI,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;AAC3D,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;AAClD,IAAI,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,UAAU,GAAG,OAAO,KAAK;AACjE,QAAQ,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAQ,cAAc,CAAC,UAAU,CAAC;AAClC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACjB,IAAI,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM;AAC/C,QAAQ,cAAc,CAAC,OAAO,CAAC;AAC/B,QAAQ,WAAW,CAAC,IAAI,CAAC;AACzB,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AACjC,IAAI,SAAS,CAAC,MAAM;AACpB,QAAQ,IAAI,CAAC,QAAQ,EAAE;AACvB,YAAY,OAAO,MAAM,EAAE,CAAC;AAC5B,QAAQ;AACR,QAAQ,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM;AAC3C,YAAY,cAAc,CAAC,CAAC,WAAW,KAAK;AAC5C,gBAAgB,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC;AAClD,gBAAgB,IAAI,UAAU,IAAI,CAAC,EAAE;AACrC,oBAAoB,aAAa,CAAC,QAAQ,CAAC;AAC3C,oBAAoB,WAAW,CAAC,KAAK,CAAC;AACtC,oBAAoB,OAAO,CAAC;AAC5B,gBAAgB;AAChB,gBAAgB,OAAO,UAAU;AACjC,YAAY,CAAC,CAAC;AACd,QAAQ,CAAC,EAAE,IAAI,CAAC;AAChB,QAAQ,OAAO,MAAM,aAAa,CAAC,QAAQ,CAAC;AAC5C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAClB,IAAI,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE;AAC5C;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable no-lonely-if */
|
|
4
|
+
function useDisableBodyScrollEffect(disable) {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
let observer;
|
|
7
|
+
let timer;
|
|
8
|
+
const lock = () => {
|
|
9
|
+
const { clientWidth } = document.documentElement;
|
|
10
|
+
const { innerWidth } = window;
|
|
11
|
+
const scrollbarWidth = clientWidth ? innerWidth - clientWidth : 0;
|
|
12
|
+
document.body.style.overflow = 'hidden';
|
|
13
|
+
document.body.style.paddingRight = `${Math.max(0, scrollbarWidth)}px`;
|
|
14
|
+
};
|
|
15
|
+
const unlock = () => {
|
|
16
|
+
document.body.style.overflow = 'unset';
|
|
17
|
+
document.body.style.paddingRight = '0px';
|
|
18
|
+
};
|
|
19
|
+
if (disable) {
|
|
20
|
+
lock();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Wait until all portal elements are removed (exit animations done)
|
|
24
|
+
if (document.querySelector('.portal')) {
|
|
25
|
+
observer = new MutationObserver(() => {
|
|
26
|
+
if (!document.querySelector('.portal')) {
|
|
27
|
+
unlock();
|
|
28
|
+
observer === null || observer === void 0 ? void 0 : observer.disconnect();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
32
|
+
// Fallback in case observer misses changes
|
|
33
|
+
timer = window.setTimeout(() => {
|
|
34
|
+
unlock();
|
|
35
|
+
observer === null || observer === void 0 ? void 0 : observer.disconnect();
|
|
36
|
+
}, 300);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
unlock();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return () => {
|
|
43
|
+
if (observer)
|
|
44
|
+
observer.disconnect();
|
|
45
|
+
if (timer)
|
|
46
|
+
window.clearTimeout(timer);
|
|
47
|
+
};
|
|
48
|
+
}, [disable]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { useDisableBodyScrollEffect as default };
|
|
52
|
+
//# sourceMappingURL=useDisableBodyScrollEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDisableBodyScrollEffect.js","sources":["../../../dist-transpiled/hooks/useDisableBodyScrollEffect.js"],"sourcesContent":["/* eslint-disable no-lonely-if */\nimport { useEffect } from 'react';\nexport default function useDisableBodyScrollEffect(disable) {\n useEffect(() => {\n let observer;\n let timer;\n const lock = () => {\n const { clientWidth } = document.documentElement;\n const { innerWidth } = window;\n const scrollbarWidth = clientWidth ? innerWidth - clientWidth : 0;\n document.body.style.overflow = 'hidden';\n document.body.style.paddingRight = `${Math.max(0, scrollbarWidth)}px`;\n };\n const unlock = () => {\n document.body.style.overflow = 'unset';\n document.body.style.paddingRight = '0px';\n };\n if (disable) {\n lock();\n }\n else {\n // Wait until all portal elements are removed (exit animations done)\n if (document.querySelector('.portal')) {\n observer = new MutationObserver(() => {\n if (!document.querySelector('.portal')) {\n unlock();\n observer === null || observer === void 0 ? void 0 : observer.disconnect();\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n // Fallback in case observer misses changes\n timer = window.setTimeout(() => {\n unlock();\n observer === null || observer === void 0 ? void 0 : observer.disconnect();\n }, 300);\n }\n else {\n unlock();\n }\n }\n return () => {\n if (observer)\n observer.disconnect();\n if (timer)\n window.clearTimeout(timer);\n };\n }, [disable]);\n}\n//# sourceMappingURL=useDisableBodyScrollEffect.js.map"],"names":[],"mappings":";;AAAA;AAEe,SAAS,0BAA0B,CAAC,OAAO,EAAE;AAC5D,IAAI,SAAS,CAAC,MAAM;AACpB,QAAQ,IAAI,QAAQ;AACpB,QAAQ,IAAI,KAAK;AACjB,QAAQ,MAAM,IAAI,GAAG,MAAM;AAC3B,YAAY,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,eAAe;AAC5D,YAAY,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM;AACzC,YAAY,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,CAAC;AAC7E,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AACnD,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;AACjF,QAAQ,CAAC;AACT,QAAQ,MAAM,MAAM,GAAG,MAAM;AAC7B,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AAClD,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;AACpD,QAAQ,CAAC;AACT,QAAQ,IAAI,OAAO,EAAE;AACrB,YAAY,IAAI,EAAE;AAClB,QAAQ;AACR,aAAa;AACb;AACA,YAAY,IAAI,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;AACnD,gBAAgB,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM;AACtD,oBAAoB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;AAC5D,wBAAwB,MAAM,EAAE;AAChC,wBAAwB,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE;AACjG,oBAAoB;AACpB,gBAAgB,CAAC,CAAC;AAClB,gBAAgB,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnF;AACA,gBAAgB,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;AAChD,oBAAoB,MAAM,EAAE;AAC5B,oBAAoB,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE;AAC7F,gBAAgB,CAAC,EAAE,GAAG,CAAC;AACvB,YAAY;AACZ,iBAAiB;AACjB,gBAAgB,MAAM,EAAE;AACxB,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,MAAM;AACrB,YAAY,IAAI,QAAQ;AACxB,gBAAgB,QAAQ,CAAC,UAAU,EAAE;AACrC,YAAY,IAAI,KAAK;AACrB,gBAAgB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;AAC1C,QAAQ,CAAC;AACT,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACjB;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import useProvidedRefOrCreate from './useProvidedRefOrCreate.js';
|
|
3
|
+
|
|
4
|
+
function useDisableInputWheel(ref) {
|
|
5
|
+
const inputRef = useProvidedRefOrCreate(ref);
|
|
6
|
+
const handleOnWheel = useCallback((event) => {
|
|
7
|
+
var _a;
|
|
8
|
+
event.stopPropagation();
|
|
9
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
10
|
+
}, [inputRef]);
|
|
11
|
+
return {
|
|
12
|
+
handleOnWheel,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { useDisableInputWheel as default };
|
|
17
|
+
//# sourceMappingURL=useDisableInputWheel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDisableInputWheel.js","sources":["../../../dist-transpiled/hooks/useDisableInputWheel.js"],"sourcesContent":["import { useCallback } from 'react';\nimport useProvidedRefOrCreate from './useProvidedRefOrCreate';\nexport default function useDisableInputWheel(ref) {\n const inputRef = useProvidedRefOrCreate(ref);\n const handleOnWheel = useCallback((event) => {\n var _a;\n event.stopPropagation();\n (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blur();\n }, [inputRef]);\n return {\n handleOnWheel,\n };\n}\n//# sourceMappingURL=useDisableInputWheel.js.map"],"names":[],"mappings":";;;AAEe,SAAS,oBAAoB,CAAC,GAAG,EAAE;AAClD,IAAI,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC;AAChD,IAAI,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,KAAK,KAAK;AACjD,QAAQ,IAAI,EAAE;AACd,QAAQ,KAAK,CAAC,eAAe,EAAE;AAC/B,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE;AAC9E,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAClB,IAAI,OAAO;AACX,QAAQ,aAAa;AACrB,KAAK;AACL;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import formatCurrency from '../utils/formatCurrency.js';
|
|
3
|
+
import { useDContext } from '../contexts/DContext.js';
|
|
4
|
+
|
|
5
|
+
function useFormatCurrency(...args) {
|
|
6
|
+
const { currency } = useDContext();
|
|
7
|
+
const format = useCallback((value, currencyOptions) => formatCurrency(value, currencyOptions || currency), [currency]);
|
|
8
|
+
const values = (args || []).map((value) => (formatCurrency(value !== null && value !== void 0 ? value : 0, currency)));
|
|
9
|
+
return {
|
|
10
|
+
format,
|
|
11
|
+
values,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { useFormatCurrency as default };
|
|
16
|
+
//# sourceMappingURL=useFormatCurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormatCurrency.js","sources":["../../../dist-transpiled/hooks/useFormatCurrency.js"],"sourcesContent":["import { useCallback } from 'react';\nimport { useDContext } from '../contexts';\nimport formatCurrency from '../utils/formatCurrency';\nexport default function useFormatCurrency(...args) {\n const { currency } = useDContext();\n const format = useCallback((value, currencyOptions) => formatCurrency(value, currencyOptions || currency), [currency]);\n const values = (args || []).map((value) => (formatCurrency(value !== null && value !== void 0 ? value : 0, currency)));\n return {\n format,\n values,\n };\n}\n//# sourceMappingURL=useFormatCurrency.js.map"],"names":[],"mappings":";;;;AAGe,SAAS,iBAAiB,CAAC,GAAG,IAAI,EAAE;AACnD,IAAI,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE;AACtC,IAAI,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,cAAc,CAAC,KAAK,EAAE,eAAe,IAAI,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAC1H,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,MAAM,cAAc,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC1H,IAAI,OAAO;AACX,QAAQ,MAAM;AACd,QAAQ,MAAM;AACd,KAAK;AACL;;;;"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { useRef, useCallback, useState, useEffect, useMemo } from 'react';
|
|
2
|
+
import currency from 'currency.js';
|
|
3
|
+
import useProvidedRefOrCreate from './useProvidedRefOrCreate.js';
|
|
4
|
+
|
|
5
|
+
function formatValue(value, currencyOptions) {
|
|
6
|
+
if (value === undefined) {
|
|
7
|
+
return '';
|
|
8
|
+
}
|
|
9
|
+
return currency(value, Object.assign(Object.assign({}, currencyOptions), { symbol: '' })).format();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* State and handlers for a currency input: a formatted string while the field
|
|
13
|
+
* is idle and the raw number while it is being edited.
|
|
14
|
+
*
|
|
15
|
+
* `minValue`/`maxValue` bound the value. With `clamp` (default `true`) an
|
|
16
|
+
* out-of-range value is brought into range whenever it is not being typed:
|
|
17
|
+
* on mount, when `value` or the bounds change, and on blur. Every time the
|
|
18
|
+
* clamp changes the value, `onChange` receives the clamped number, so the
|
|
19
|
+
* input and the consumer's state never disagree. While the field is focused
|
|
20
|
+
* the typed number is reported as is, so a partial entry is not rewritten.
|
|
21
|
+
*
|
|
22
|
+
* With `clamp: false` the value is never changed: the bounds only feed
|
|
23
|
+
* `isOverMax` / `isUnderMin`, so the consumer can show its own message (e.g.
|
|
24
|
+
* "You exceeded the limit") and keep the entered amount.
|
|
25
|
+
*
|
|
26
|
+
* Controlled usage follows the same contract as a native controlled input:
|
|
27
|
+
* reflect `onChange` into `value` in the same event (`setState` in the
|
|
28
|
+
* handler). The hook keeps showing `value` whenever it isn't being edited, so
|
|
29
|
+
* a consumer can reject a change by keeping `value` as it was. Deferring the
|
|
30
|
+
* update (a timer, awaiting a request) makes the hook see a stale `value` in
|
|
31
|
+
* between: the field can flash the previous amount and a clamp can be
|
|
32
|
+
* reported again when the deferred value arrives.
|
|
33
|
+
*/
|
|
34
|
+
function useInputCurrency(currencyOptions, value, onFocus, onChange, onBlur, ref, minValue, maxValue, clamp = true) {
|
|
35
|
+
const inputRef = useProvidedRefOrCreate(ref);
|
|
36
|
+
const onChangeRef = useRef(onChange);
|
|
37
|
+
onChangeRef.current = onChange;
|
|
38
|
+
// Last clamp reported through `onChange`, as the value it came from and the
|
|
39
|
+
// value it produced. StrictMode replays effects, and a consumer may reflect
|
|
40
|
+
// `onChange` asynchronously, both before `value` catches up: the same clamp
|
|
41
|
+
// must not be reported twice.
|
|
42
|
+
const lastReportedClampRef = useRef(null);
|
|
43
|
+
const clampValue = useCallback((newValue) => {
|
|
44
|
+
if (newValue === undefined || !clamp) {
|
|
45
|
+
return newValue;
|
|
46
|
+
}
|
|
47
|
+
let clampedValue = newValue;
|
|
48
|
+
if (minValue !== undefined) {
|
|
49
|
+
clampedValue = Math.max(clampedValue, minValue);
|
|
50
|
+
}
|
|
51
|
+
if (maxValue !== undefined) {
|
|
52
|
+
clampedValue = Math.min(clampedValue, maxValue);
|
|
53
|
+
}
|
|
54
|
+
return clampedValue;
|
|
55
|
+
}, [minValue, maxValue, clamp]);
|
|
56
|
+
const [innerType, setInnerType] = useState('text');
|
|
57
|
+
const [innerNumber, setInnerNumber] = useState(() => clampValue(value));
|
|
58
|
+
const handleOnFocus = useCallback((event) => {
|
|
59
|
+
event.stopPropagation();
|
|
60
|
+
setInnerType('number');
|
|
61
|
+
onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
|
|
62
|
+
}, [onFocus]);
|
|
63
|
+
const handleOnBlur = useCallback((event) => {
|
|
64
|
+
event.stopPropagation();
|
|
65
|
+
setInnerType('text');
|
|
66
|
+
const clampedNumber = clampValue(innerNumber);
|
|
67
|
+
if (clampedNumber !== innerNumber) {
|
|
68
|
+
setInnerNumber(clampedNumber);
|
|
69
|
+
// Recorded before notifying, so the sync effect that runs when editing
|
|
70
|
+
// ends doesn't report the same clamp again while `value` still holds the
|
|
71
|
+
// typed number.
|
|
72
|
+
lastReportedClampRef.current = { from: value, to: clampedNumber };
|
|
73
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(clampedNumber);
|
|
74
|
+
}
|
|
75
|
+
onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
|
|
76
|
+
}, [onBlur, innerNumber, clampValue, onChange, value]);
|
|
77
|
+
const handleOnChange = useCallback((newValue) => {
|
|
78
|
+
const newNumber = (newValue === undefined || newValue === '') ? undefined : Number(newValue);
|
|
79
|
+
if (newNumber !== innerNumber) {
|
|
80
|
+
setInnerNumber(newNumber);
|
|
81
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(newNumber);
|
|
82
|
+
}
|
|
83
|
+
}, [onChange, innerNumber]);
|
|
84
|
+
const isEditing = innerType === 'number';
|
|
85
|
+
// Keep the inner value in sync with `value` and the bounds. While the user
|
|
86
|
+
// is typing, the consumer echoes the typed number back through `value`, so
|
|
87
|
+
// it is taken as is; otherwise it is clamped, and a clamp that changes it is
|
|
88
|
+
// reported through `onChange`.
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
var _a;
|
|
91
|
+
const nextNumber = isEditing ? value : clampValue(value);
|
|
92
|
+
if (nextNumber !== innerNumber) {
|
|
93
|
+
setInnerNumber(nextNumber);
|
|
94
|
+
}
|
|
95
|
+
if (nextNumber !== value) {
|
|
96
|
+
const last = lastReportedClampRef.current;
|
|
97
|
+
if (!last || last.from !== value || last.to !== nextNumber) {
|
|
98
|
+
lastReportedClampRef.current = { from: value, to: nextNumber };
|
|
99
|
+
(_a = onChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onChangeRef, nextNumber);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
lastReportedClampRef.current = null;
|
|
104
|
+
}
|
|
105
|
+
// `innerNumber` is read, not tracked: the effect reacts to the consumer's
|
|
106
|
+
// value and to the bounds, not to its own updates.
|
|
107
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
108
|
+
}, [value, clampValue, isEditing]);
|
|
109
|
+
// Derived, not stored: the formatted text always matches the current number
|
|
110
|
+
// and options, even when both change in the same render. It depends on the
|
|
111
|
+
// options object itself, so a new custom `format` function is honored too;
|
|
112
|
+
// formatting is cheap and doesn't feed the synchronization effect.
|
|
113
|
+
const innerString = useMemo(() => formatValue(innerNumber, currencyOptions), [innerNumber, currencyOptions]);
|
|
114
|
+
const innerValue = useMemo(() => { var _a; return (innerType === 'number' ? (_a = innerNumber === null || innerNumber === void 0 ? void 0 : innerNumber.toString()) !== null && _a !== void 0 ? _a : '' : innerString); }, [innerType, innerNumber, innerString]);
|
|
115
|
+
const isOverMax = maxValue !== undefined && innerNumber !== undefined && innerNumber > maxValue;
|
|
116
|
+
const isUnderMin = minValue !== undefined && innerNumber !== undefined && innerNumber < minValue;
|
|
117
|
+
return {
|
|
118
|
+
inputRef,
|
|
119
|
+
innerValue,
|
|
120
|
+
innerType,
|
|
121
|
+
isOverMax,
|
|
122
|
+
isUnderMin,
|
|
123
|
+
handleOnFocus,
|
|
124
|
+
handleOnChange,
|
|
125
|
+
handleOnBlur,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { useInputCurrency as default };
|
|
130
|
+
//# sourceMappingURL=useInputCurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInputCurrency.js","sources":["../../../dist-transpiled/hooks/useInputCurrency.js"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';\nimport currency from 'currency.js';\nimport useProvidedRefOrCreate from './useProvidedRefOrCreate';\nfunction formatValue(value, currencyOptions) {\n if (value === undefined) {\n return '';\n }\n return currency(value, Object.assign(Object.assign({}, currencyOptions), { symbol: '' })).format();\n}\n/**\n * State and handlers for a currency input: a formatted string while the field\n * is idle and the raw number while it is being edited.\n *\n * `minValue`/`maxValue` bound the value. With `clamp` (default `true`) an\n * out-of-range value is brought into range whenever it is not being typed:\n * on mount, when `value` or the bounds change, and on blur. Every time the\n * clamp changes the value, `onChange` receives the clamped number, so the\n * input and the consumer's state never disagree. While the field is focused\n * the typed number is reported as is, so a partial entry is not rewritten.\n *\n * With `clamp: false` the value is never changed: the bounds only feed\n * `isOverMax` / `isUnderMin`, so the consumer can show its own message (e.g.\n * \"You exceeded the limit\") and keep the entered amount.\n *\n * Controlled usage follows the same contract as a native controlled input:\n * reflect `onChange` into `value` in the same event (`setState` in the\n * handler). The hook keeps showing `value` whenever it isn't being edited, so\n * a consumer can reject a change by keeping `value` as it was. Deferring the\n * update (a timer, awaiting a request) makes the hook see a stale `value` in\n * between: the field can flash the previous amount and a clamp can be\n * reported again when the deferred value arrives.\n */\nexport default function useInputCurrency(currencyOptions, value, onFocus, onChange, onBlur, ref, minValue, maxValue, clamp = true) {\n const inputRef = useProvidedRefOrCreate(ref);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n // Last clamp reported through `onChange`, as the value it came from and the\n // value it produced. StrictMode replays effects, and a consumer may reflect\n // `onChange` asynchronously, both before `value` catches up: the same clamp\n // must not be reported twice.\n const lastReportedClampRef = useRef(null);\n const clampValue = useCallback((newValue) => {\n if (newValue === undefined || !clamp) {\n return newValue;\n }\n let clampedValue = newValue;\n if (minValue !== undefined) {\n clampedValue = Math.max(clampedValue, minValue);\n }\n if (maxValue !== undefined) {\n clampedValue = Math.min(clampedValue, maxValue);\n }\n return clampedValue;\n }, [minValue, maxValue, clamp]);\n const [innerType, setInnerType] = useState('text');\n const [innerNumber, setInnerNumber] = useState(() => clampValue(value));\n const handleOnFocus = useCallback((event) => {\n event.stopPropagation();\n setInnerType('number');\n onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);\n }, [onFocus]);\n const handleOnBlur = useCallback((event) => {\n event.stopPropagation();\n setInnerType('text');\n const clampedNumber = clampValue(innerNumber);\n if (clampedNumber !== innerNumber) {\n setInnerNumber(clampedNumber);\n // Recorded before notifying, so the sync effect that runs when editing\n // ends doesn't report the same clamp again while `value` still holds the\n // typed number.\n lastReportedClampRef.current = { from: value, to: clampedNumber };\n onChange === null || onChange === void 0 ? void 0 : onChange(clampedNumber);\n }\n onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);\n }, [onBlur, innerNumber, clampValue, onChange, value]);\n const handleOnChange = useCallback((newValue) => {\n const newNumber = (newValue === undefined || newValue === '') ? undefined : Number(newValue);\n if (newNumber !== innerNumber) {\n setInnerNumber(newNumber);\n onChange === null || onChange === void 0 ? void 0 : onChange(newNumber);\n }\n }, [onChange, innerNumber]);\n const isEditing = innerType === 'number';\n // Keep the inner value in sync with `value` and the bounds. While the user\n // is typing, the consumer echoes the typed number back through `value`, so\n // it is taken as is; otherwise it is clamped, and a clamp that changes it is\n // reported through `onChange`.\n useEffect(() => {\n var _a;\n const nextNumber = isEditing ? value : clampValue(value);\n if (nextNumber !== innerNumber) {\n setInnerNumber(nextNumber);\n }\n if (nextNumber !== value) {\n const last = lastReportedClampRef.current;\n if (!last || last.from !== value || last.to !== nextNumber) {\n lastReportedClampRef.current = { from: value, to: nextNumber };\n (_a = onChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onChangeRef, nextNumber);\n }\n }\n else {\n lastReportedClampRef.current = null;\n }\n // `innerNumber` is read, not tracked: the effect reacts to the consumer's\n // value and to the bounds, not to its own updates.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clampValue, isEditing]);\n // Derived, not stored: the formatted text always matches the current number\n // and options, even when both change in the same render. It depends on the\n // options object itself, so a new custom `format` function is honored too;\n // formatting is cheap and doesn't feed the synchronization effect.\n const innerString = useMemo(() => formatValue(innerNumber, currencyOptions), [innerNumber, currencyOptions]);\n const innerValue = useMemo(() => { var _a; return (innerType === 'number' ? (_a = innerNumber === null || innerNumber === void 0 ? void 0 : innerNumber.toString()) !== null && _a !== void 0 ? _a : '' : innerString); }, [innerType, innerNumber, innerString]);\n const isOverMax = maxValue !== undefined && innerNumber !== undefined && innerNumber > maxValue;\n const isUnderMin = minValue !== undefined && innerNumber !== undefined && innerNumber < minValue;\n return {\n inputRef,\n innerValue,\n innerType,\n isOverMax,\n isUnderMin,\n handleOnFocus,\n handleOnChange,\n handleOnBlur,\n };\n}\n//# sourceMappingURL=useInputCurrency.js.map"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useCallback, useState, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function useItemSelection({ getItemIdentifier: getItemIdentifierProp, previousSelected = [], } = {}) {
|
|
4
|
+
const getItemIdentifier = useCallback((item) => (String(getItemIdentifierProp ? getItemIdentifierProp(item) : item.id)), [getItemIdentifierProp]);
|
|
5
|
+
const [selectionMap, setSelectionMap] = useState(() => new Map(previousSelected.map((item) => [getItemIdentifier(item), item])));
|
|
6
|
+
const selectedItems = useMemo(() => Array.from(selectionMap.values()), [selectionMap]);
|
|
7
|
+
const setSelectedItems = useCallback((items) => {
|
|
8
|
+
setSelectionMap(new Map(items.map((item) => [getItemIdentifier(item), item])));
|
|
9
|
+
}, [getItemIdentifier]);
|
|
10
|
+
const isSelectedItem = useCallback((item) => selectionMap.has(getItemIdentifier(item)), [getItemIdentifier, selectionMap]);
|
|
11
|
+
const toggleSelectedItem = useCallback((item) => {
|
|
12
|
+
const identifier = getItemIdentifier(item);
|
|
13
|
+
setSelectionMap((prev) => {
|
|
14
|
+
const newMap = new Map(prev);
|
|
15
|
+
if (newMap.has(identifier)) {
|
|
16
|
+
newMap.delete(identifier);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
newMap.set(identifier, item);
|
|
20
|
+
}
|
|
21
|
+
return newMap;
|
|
22
|
+
});
|
|
23
|
+
}, [getItemIdentifier]);
|
|
24
|
+
const resetSelectedItems = useCallback(() => setSelectionMap(new Map()), []);
|
|
25
|
+
return {
|
|
26
|
+
selectedItems,
|
|
27
|
+
isSelectedItem,
|
|
28
|
+
toggleSelectedItem,
|
|
29
|
+
resetSelectedItems,
|
|
30
|
+
setSelectedItems,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { useItemSelection as default };
|
|
35
|
+
//# sourceMappingURL=useItemSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useItemSelection.js","sources":["../../../dist-transpiled/hooks/useItemSelection.js"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nexport default function useItemSelection({ getItemIdentifier: getItemIdentifierProp, previousSelected = [], } = {}) {\n const getItemIdentifier = useCallback((item) => (String(getItemIdentifierProp ? getItemIdentifierProp(item) : item.id)), [getItemIdentifierProp]);\n const [selectionMap, setSelectionMap] = useState(() => new Map(previousSelected.map((item) => [getItemIdentifier(item), item])));\n const selectedItems = useMemo(() => Array.from(selectionMap.values()), [selectionMap]);\n const setSelectedItems = useCallback((items) => {\n setSelectionMap(new Map(items.map((item) => [getItemIdentifier(item), item])));\n }, [getItemIdentifier]);\n const isSelectedItem = useCallback((item) => selectionMap.has(getItemIdentifier(item)), [getItemIdentifier, selectionMap]);\n const toggleSelectedItem = useCallback((item) => {\n const identifier = getItemIdentifier(item);\n setSelectionMap((prev) => {\n const newMap = new Map(prev);\n if (newMap.has(identifier)) {\n newMap.delete(identifier);\n }\n else {\n newMap.set(identifier, item);\n }\n return newMap;\n });\n }, [getItemIdentifier]);\n const resetSelectedItems = useCallback(() => setSelectionMap(new Map()), []);\n return {\n selectedItems,\n isSelectedItem,\n toggleSelectedItem,\n resetSelectedItems,\n setSelectedItems,\n };\n}\n//# sourceMappingURL=useItemSelection.js.map"],"names":[],"mappings":";;AACe,SAAS,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE;AACpH,IAAI,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,qBAAqB,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;AACrJ,IAAI,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACpI,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;AAC1F,IAAI,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,KAAK,KAAK;AACpD,QAAQ,eAAe,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtF,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAC3B,IAAI,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAC9H,IAAI,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,IAAI,KAAK;AACrD,QAAQ,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC;AAClD,QAAQ,eAAe,CAAC,CAAC,IAAI,KAAK;AAClC,YAAY,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AACxC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACxC,gBAAgB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,YAAY;AACZ,iBAAiB;AACjB,gBAAgB,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;AAC5C,YAAY;AACZ,YAAY,OAAO,MAAM;AACzB,QAAQ,CAAC,CAAC;AACV,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAC3B,IAAI,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAChF,IAAI,OAAO;AACX,QAAQ,aAAa;AACrB,QAAQ,cAAc;AACtB,QAAQ,kBAAkB;AAC1B,QAAQ,kBAAkB;AAC1B,QAAQ,gBAAgB;AACxB,KAAK;AACL;;;;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useDContext } from '../contexts/DContext.js';
|
|
3
|
+
import { PREFIX_BS } from '../components/config.js';
|
|
4
|
+
import useMediaQuery from './useMediaQuery.js';
|
|
5
|
+
|
|
6
|
+
const BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
|
|
7
|
+
// Breakpoints read from the CSS on first use and shared by every component
|
|
8
|
+
// that resolves responsive props: one computed-style read for the page,
|
|
9
|
+
// instead of one per breakpoint per render. `dynamic-ui.css` has to be loaded
|
|
10
|
+
// before rendering; if it isn't, the empty result is kept too, so a
|
|
11
|
+
// misconfigured tree doesn't pay the read on every render (responsive props
|
|
12
|
+
// then keep their default value and useResponsiveProp warns in development).
|
|
13
|
+
let cssBreakpoints = null;
|
|
14
|
+
function readCssBreakpoint(breakpoint) {
|
|
15
|
+
if (cssBreakpoints)
|
|
16
|
+
return cssBreakpoints[breakpoint];
|
|
17
|
+
if (typeof document === 'undefined')
|
|
18
|
+
return '';
|
|
19
|
+
const style = getComputedStyle(document.documentElement);
|
|
20
|
+
const read = Object.fromEntries(BREAKPOINTS.map((name) => [
|
|
21
|
+
name,
|
|
22
|
+
style.getPropertyValue(`--${PREFIX_BS}breakpoint-${name}`).trim(),
|
|
23
|
+
]));
|
|
24
|
+
cssBreakpoints = read;
|
|
25
|
+
return read[breakpoint];
|
|
26
|
+
}
|
|
27
|
+
/** Clears the cached CSS breakpoints. Only meant for tests. */
|
|
28
|
+
function resetCssBreakpointsCache() {
|
|
29
|
+
cssBreakpoints = null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Pixel value of a breakpoint. `DContextProvider` reads them from the CSS and
|
|
33
|
+
* shares them through the context; outside of it (a tree without the
|
|
34
|
+
* provider, or its first render) they are read from the same CSS variables
|
|
35
|
+
* here, so responsive props resolve either way.
|
|
36
|
+
*/
|
|
37
|
+
function useBreakpointValue(breakpoint) {
|
|
38
|
+
const { breakpoints } = useDContext();
|
|
39
|
+
const fromContext = breakpoints[breakpoint];
|
|
40
|
+
return useMemo(() => fromContext || readCssBreakpoint(breakpoint), [fromContext, breakpoint]);
|
|
41
|
+
}
|
|
42
|
+
function useMediaBreakpointUp(breakpoint, useListener = false) {
|
|
43
|
+
const value = useBreakpointValue(breakpoint);
|
|
44
|
+
// Without a breakpoint the query can't match; `not all` keeps it false
|
|
45
|
+
// instead of an invalid `(min-width: )`.
|
|
46
|
+
const mediaQuery = value ? `(min-width: ${value})` : 'not all';
|
|
47
|
+
return useMediaQuery(mediaQuery, useListener);
|
|
48
|
+
}
|
|
49
|
+
function useMediaBreakpointUpXs(useListener = false) {
|
|
50
|
+
return useMediaBreakpointUp('xs', useListener);
|
|
51
|
+
}
|
|
52
|
+
function useMediaBreakpointUpSm(useListener = false) {
|
|
53
|
+
return useMediaBreakpointUp('sm', useListener);
|
|
54
|
+
}
|
|
55
|
+
function useMediaBreakpointUpMd(useListener = false) {
|
|
56
|
+
return useMediaBreakpointUp('md', useListener);
|
|
57
|
+
}
|
|
58
|
+
function useMediaBreakpointUpLg(useListener = false) {
|
|
59
|
+
return useMediaBreakpointUp('lg', useListener);
|
|
60
|
+
}
|
|
61
|
+
function useMediaBreakpointUpXl(useListener = false) {
|
|
62
|
+
return useMediaBreakpointUp('xl', useListener);
|
|
63
|
+
}
|
|
64
|
+
function useMediaBreakpointUpXxl(useListener = false) {
|
|
65
|
+
return useMediaBreakpointUp('xxl', useListener);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { resetCssBreakpointsCache, useBreakpointValue, useMediaBreakpointUpLg, useMediaBreakpointUpMd, useMediaBreakpointUpSm, useMediaBreakpointUpXl, useMediaBreakpointUpXs, useMediaBreakpointUpXxl };
|
|
69
|
+
//# sourceMappingURL=useMediaBreakpointUp.js.map
|