@rio-cloud/rio-uikit 2.1.0 → 2.2.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/CircularProgress.d.ts +2 -0
- package/CircularProgress.js +5 -0
- package/CircularProgress.js.map +1 -0
- package/RadioCardGroup.d.ts +2 -0
- package/RadioCardGroup.js +7 -0
- package/RadioCardGroup.js.map +1 -0
- package/SearchHighlightText.d.ts +2 -0
- package/SearchHighlightText.js +5 -0
- package/SearchHighlightText.js.map +1 -0
- package/TextTruncateMiddle.d.ts +2 -0
- package/TextTruncateMiddle.js +5 -0
- package/TextTruncateMiddle.js.map +1 -0
- package/Tracker.d.ts +2 -0
- package/Tracker.js +5 -0
- package/Tracker.js.map +1 -0
- package/classNames.d.ts +2 -0
- package/classNames.js +5 -0
- package/classNames.js.map +1 -0
- package/components/accentBar/AccentBar.js +1 -1
- package/components/accentBar/AccentBar.js.map +1 -1
- package/components/actionBarItem/ActionBarItem.js +7 -7
- package/components/actionBarItem/ActionBarItem.js.map +1 -1
- package/components/actionBarItem/ActionBarItemIcon.js +1 -1
- package/components/actionBarItem/ActionBarItemIcon.js.map +1 -1
- package/components/actionBarItem/ActionBarItemList.js +1 -1
- package/components/actionBarItem/ActionBarItemList.js.map +1 -1
- package/components/actionBarItem/ActionBarItemListItem.js +1 -1
- package/components/actionBarItem/ActionBarItemListItem.js.map +1 -1
- package/components/actionBarItem/ActionBarItemListSeparator.js +1 -1
- package/components/actionBarItem/ActionBarItemListSeparator.js.map +1 -1
- package/components/actionBarItem/ActionBarItemPopoverContent.js +3 -3
- package/components/actionBarItem/ActionBarItemPopoverContent.js.map +1 -1
- package/components/actionBarItem/ActionBarOverlay.js +1 -1
- package/components/actionBarItem/ActionBarOverlay.js.map +1 -1
- package/components/activity/Activity.js +1 -1
- package/components/activity/Activity.js.map +1 -1
- package/components/animatedTextReveal/AnimatedTextReveal.js +1 -1
- package/components/animatedTextReveal/AnimatedTextReveal.js.map +1 -1
- package/components/applicationHeader/AppMenu.js +2 -2
- package/components/applicationHeader/AppMenu.js.map +1 -1
- package/components/applicationHeader/AppMenuDropdown.js +13 -11
- package/components/applicationHeader/AppMenuDropdown.js.map +1 -1
- package/components/applicationHeader/ApplicationHeader.js +1 -1
- package/components/applicationHeader/ApplicationHeader.js.map +1 -1
- package/components/applicationHeader/MobileHeaderModal.js +8 -8
- package/components/applicationHeader/MobileHeaderModal.js.map +1 -1
- package/components/applicationHeader/MobileSubmoduleNavigation.js +1 -1
- package/components/applicationHeader/MobileSubmoduleNavigation.js.map +1 -1
- package/components/applicationHeader/NavItems.js +4 -4
- package/components/applicationHeader/NavItems.js.map +1 -1
- package/components/applicationLayout/ApplicationLayout.js +10 -10
- package/components/applicationLayout/ApplicationLayout.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutBody.js +2 -2
- package/components/applicationLayout/ApplicationLayoutBody.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyBanner.js +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyBanner.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyBottomBar.js +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyBottomBar.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyNavigation.js +1 -1
- package/components/applicationLayout/ApplicationLayoutBodyNavigation.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutHeader.js +1 -1
- package/components/applicationLayout/ApplicationLayoutHeader.js.map +1 -1
- package/components/applicationLayout/ApplicationLayoutSidebar.js +1 -1
- package/components/applicationLayout/ApplicationLayoutSidebar.js.map +1 -1
- package/components/applicationLayout/SubNavigation.js +1 -1
- package/components/applicationLayout/SubNavigation.js.map +1 -1
- package/components/assetTree/AssetTree.js +1 -1
- package/components/assetTree/AssetTree.js.map +1 -1
- package/components/assetTree/Tree.js +1 -1
- package/components/assetTree/Tree.js.map +1 -1
- package/components/assetTree/TreeIcon.js +3 -3
- package/components/assetTree/TreeIcon.js.map +1 -1
- package/components/assetTree/TreeLeaf.js +4 -4
- package/components/assetTree/TreeLeaf.js.map +1 -1
- package/components/assetTree/TreeNode.js +1 -1
- package/components/assetTree/TreeNode.js.map +1 -1
- package/components/assetTree/TreeNodeContainer.js +1 -1
- package/components/assetTree/TreeNodeContainer.js.map +1 -1
- package/components/assetTree/TreeOption.js +3 -3
- package/components/assetTree/TreeOption.js.map +1 -1
- package/components/assetTree/TreeOptions.js +4 -4
- package/components/assetTree/TreeOptions.js.map +1 -1
- package/components/assetTree/TreeRoot.js +3 -3
- package/components/assetTree/TreeRoot.js.map +1 -1
- package/components/assetTree/TreeSearch.js +3 -3
- package/components/assetTree/TreeSearch.js.map +1 -1
- package/components/assetTree/TreeSidebar.js +1 -1
- package/components/assetTree/TreeSidebar.js.map +1 -1
- package/components/assetTree/TreeSidebarCategories.js +4 -4
- package/components/assetTree/TreeSidebarCategories.js.map +1 -1
- package/components/assetTree/TreeSummary.js +1 -1
- package/components/assetTree/TreeSummary.js.map +1 -1
- package/components/assetTree/TypeCounter.js +1 -1
- package/components/assetTree/TypeCounter.js.map +1 -1
- package/components/autosuggest/AutoSuggest.js +1 -1
- package/components/autosuggest/AutoSuggest.js.map +1 -1
- package/components/avatar/Avatar.js +1 -1
- package/components/avatar/Avatar.js.map +1 -1
- package/components/banner/Banner.js +1 -1
- package/components/banner/Banner.js.map +1 -1
- package/components/banner/BannerContent.js +1 -1
- package/components/banner/BannerContent.js.map +1 -1
- package/components/barList/BarList.js +1 -1
- package/components/barList/BarList.js.map +1 -1
- package/components/bottomSheet/BottomSheet.js +1 -1
- package/components/bottomSheet/BottomSheet.js.map +1 -1
- package/components/button/Button.d.ts +53 -7
- package/components/button/Button.js +87 -64
- package/components/button/Button.js.map +1 -1
- package/components/button/ButtonToolbar.js +1 -1
- package/components/button/ButtonToolbar.js.map +1 -1
- package/components/button/ToggleButton.d.ts +4 -1
- package/components/button/ToggleButton.js.map +1 -1
- package/components/calendarStripe/CalendarStripe.js +16 -16
- package/components/calendarStripe/CalendarStripe.js.map +1 -1
- package/components/card/Card.js +1 -1
- package/components/card/Card.js.map +1 -1
- package/components/charts/RadialBarChart.js +106 -103
- package/components/charts/RadialBarChart.js.map +1 -1
- package/components/checkbox/Checkbox.js +6 -6
- package/components/checkbox/Checkbox.js.map +1 -1
- package/components/circularProgress/CircularProgress.d.ts +139 -0
- package/components/circularProgress/CircularProgress.js +197 -0
- package/components/circularProgress/CircularProgress.js.map +1 -0
- package/components/clearableInput/ClearableInput.js +9 -9
- package/components/clearableInput/ClearableInput.js.map +1 -1
- package/components/dataTabs/DataTabHeader.js +1 -1
- package/components/dataTabs/DataTabHeader.js.map +1 -1
- package/components/dataTabs/DataTabs.js +4 -4
- package/components/dataTabs/DataTabs.js.map +1 -1
- package/components/datepicker/DatePicker.js +6 -6
- package/components/datepicker/DatePicker.js.map +1 -1
- package/components/datepicker/DateRangePicker.js +1 -1
- package/components/datepicker/DateRangePicker.js.map +1 -1
- package/components/datepicker/DayPicker.js +1 -1
- package/components/datepicker/DayPicker.js.map +1 -1
- package/components/dialog/Dialog.js +55 -55
- package/components/dialog/Dialog.js.map +1 -1
- package/components/dialog/DialogBody.js +1 -1
- package/components/dialog/DialogBody.js.map +1 -1
- package/components/dialog/DialogFooter.js +1 -1
- package/components/dialog/DialogFooter.js.map +1 -1
- package/components/dialog/DialogHeader.js +1 -1
- package/components/dialog/DialogHeader.js.map +1 -1
- package/components/dialog/MediaDialog.js +1 -1
- package/components/dialog/MediaDialog.js.map +1 -1
- package/components/dialog/SplitDialog.js +1 -1
- package/components/dialog/SplitDialog.js.map +1 -1
- package/components/divider/Divider.js +1 -1
- package/components/divider/Divider.js.map +1 -1
- package/components/dropdown/ButtonDropdown.js +1 -1
- package/components/dropdown/ButtonDropdown.js.map +1 -1
- package/components/dropdown/DropdownSubmenu.js +3 -3
- package/components/dropdown/DropdownSubmenu.js.map +1 -1
- package/components/dropdown/DropdownToggleButton.d.ts +1 -1
- package/components/dropdown/DropdownToggleButton.js +4 -3
- package/components/dropdown/DropdownToggleButton.js.map +1 -1
- package/components/dropdown/SplitCaretButton.js +6 -6
- package/components/dropdown/SplitCaretButton.js.map +1 -1
- package/components/editableContent/EditableContent.js +1 -1
- package/components/editableContent/EditableContent.js.map +1 -1
- package/components/ellipsis/TextTruncateMiddle.d.ts +23 -0
- package/components/ellipsis/TextTruncateMiddle.js +21 -0
- package/components/ellipsis/TextTruncateMiddle.js.map +1 -0
- package/components/expander/ExpanderList.js +5 -5
- package/components/expander/ExpanderList.js.map +1 -1
- package/components/expander/ExpanderPanel.js +1 -1
- package/components/expander/ExpanderPanel.js.map +1 -1
- package/components/feedback/FeedbackRating.js +1 -1
- package/components/feedback/FeedbackRating.js.map +1 -1
- package/components/feedback/FeedbackReactions.js +1 -1
- package/components/feedback/FeedbackReactions.js.map +1 -1
- package/components/formLabel/FormLabel.js +6 -9
- package/components/formLabel/FormLabel.js.map +1 -1
- package/components/formLabel/LabeledElement.js +1 -1
- package/components/formLabel/LabeledElement.js.map +1 -1
- package/components/listMenu/ListMenu.js +2 -5
- package/components/listMenu/ListMenu.js.map +1 -1
- package/components/listMenu/ListMenuGroup.js +2 -2
- package/components/listMenu/ListMenuGroup.js.map +1 -1
- package/components/loadMore/LoadMoreButton.js +1 -1
- package/components/loadMore/LoadMoreButton.js.map +1 -1
- package/components/loadMore/LoadMoreProgress.js +1 -1
- package/components/loadMore/LoadMoreProgress.js.map +1 -1
- package/components/map/components/features/MapSettings.js +4 -4
- package/components/map/components/features/MapSettings.js.map +1 -1
- package/components/map/components/features/settings/MapSettingsItem.js +1 -1
- package/components/map/components/features/settings/MapSettingsItem.js.map +1 -1
- package/components/map/components/features/settings/MapSettingsPanel.js +6 -20
- package/components/map/components/features/settings/MapSettingsPanel.js.map +1 -1
- package/components/map/components/features/settings/MapSettingsTile.js +87 -61
- package/components/map/components/features/settings/MapSettingsTile.js.map +1 -1
- package/components/map/components/features/settings/ZoomButtons.js +1 -1
- package/components/map/components/features/settings/ZoomButtons.js.map +1 -1
- package/components/map/components/features/settings/builtinSettings/MapTypeSettings.d.ts +38 -1
- package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js +128 -92
- package/components/map/components/features/settings/builtinSettings/MapTypeSettings.js.map +1 -1
- package/components/map/utils/eventHandling.js +9 -9
- package/components/map/utils/eventHandling.js.map +1 -1
- package/components/map/utils/mapUtils.d.ts +6 -6
- package/components/map/utils/mapUtils.js +14 -19
- package/components/map/utils/mapUtils.js.map +1 -1
- package/components/mapMarker/ClusterMapMarker.js +1 -1
- package/components/mapMarker/ClusterMapMarker.js.map +1 -1
- package/components/mapMarker/SingleMapMarker.js +1 -1
- package/components/mapMarker/SingleMapMarker.js.map +1 -1
- package/components/menuItems/MenuItem.js +1 -1
- package/components/menuItems/MenuItem.js.map +1 -1
- package/components/menuItems/MenuItemList.js +1 -1
- package/components/menuItems/MenuItemList.js.map +1 -1
- package/components/navigation/AppNavigationBar.js +4 -4
- package/components/navigation/AppNavigationBar.js.map +1 -1
- package/components/noData/NoData.js +1 -1
- package/components/noData/NoData.js.map +1 -1
- package/components/numberControl/NumberControl.js +4 -4
- package/components/numberControl/NumberControl.js.map +1 -1
- package/components/numberInput/NumberInput.js +1 -1
- package/components/numberInput/NumberInput.js.map +1 -1
- package/components/onboarding/OnboardingTip.js +4 -4
- package/components/onboarding/OnboardingTip.js.map +1 -1
- package/components/page/Page.js +1 -1
- package/components/page/Page.js.map +1 -1
- package/components/pager/Pager.js +1 -1
- package/components/pager/Pager.js.map +1 -1
- package/components/radiobutton/RadioButton.d.ts +1 -1
- package/components/radiobutton/RadioButton.js +5 -5
- package/components/radiobutton/RadioButton.js.map +1 -1
- package/components/radiobutton/RadioCardGroup.d.ts +86 -0
- package/components/radiobutton/RadioCardGroup.js +110 -0
- package/components/radiobutton/RadioCardGroup.js.map +1 -0
- package/components/resizer/Resizer.js +1 -1
- package/components/resizer/Resizer.js.map +1 -1
- package/components/responsiveColumnStripe/ResponsiveColumnStripe.js +1 -1
- package/components/responsiveColumnStripe/ResponsiveColumnStripe.js.map +1 -1
- package/components/rioglyph/Rioglyph.js +1 -1
- package/components/rioglyph/Rioglyph.js.map +1 -1
- package/components/rioglyph/RioglyphIconType.d.ts +1 -1
- package/components/rules/RuleConnector.js +1 -1
- package/components/rules/RuleConnector.js.map +1 -1
- package/components/rules/RuleContainer.js +27 -27
- package/components/rules/RuleContainer.js.map +1 -1
- package/components/saveableInput/SaveableDateInput.js +1 -1
- package/components/saveableInput/SaveableDateInput.js.map +1 -1
- package/components/saveableInput/SaveableInput.js +49 -49
- package/components/saveableInput/SaveableInput.js.map +1 -1
- package/components/searchHighlight/SearchHighlightText.d.ts +28 -0
- package/components/searchHighlight/SearchHighlightText.js +15 -0
- package/components/searchHighlight/SearchHighlightText.js.map +1 -0
- package/components/selects/BaseSelectDropdown.js +1 -1
- package/components/selects/BaseSelectDropdown.js.map +1 -1
- package/components/selects/ClearButton.js +4 -4
- package/components/selects/ClearButton.js.map +1 -1
- package/components/selects/Multiselect.js +6 -6
- package/components/selects/Multiselect.js.map +1 -1
- package/components/selects/MultiselectToggleFilter.js +4 -4
- package/components/selects/MultiselectToggleFilter.js.map +1 -1
- package/components/selects/MultiselectToggleSelection.js +1 -1
- package/components/selects/MultiselectToggleSelection.js.map +1 -1
- package/components/selects/Select.js +6 -6
- package/components/selects/Select.js.map +1 -1
- package/components/selects/SelectFilter.js +1 -1
- package/components/selects/SelectFilter.js.map +1 -1
- package/components/selects/WithFeedbackAndAddon.js +1 -1
- package/components/selects/WithFeedbackAndAddon.js.map +1 -1
- package/components/sidebars/Sidebar.js +54 -54
- package/components/sidebars/Sidebar.js.map +1 -1
- package/components/sidebars/SidebarBackdrop.js +4 -4
- package/components/sidebars/SidebarBackdrop.js.map +1 -1
- package/components/sidebars/SidebarFooter.js +1 -1
- package/components/sidebars/SidebarFooter.js.map +1 -1
- package/components/sidebars/SidebarFullscreenToggle.js +4 -4
- package/components/sidebars/SidebarFullscreenToggle.js.map +1 -1
- package/components/slider/RangeSlider.js +1 -1
- package/components/slider/RangeSlider.js.map +1 -1
- package/components/slider/Slider.js +1 -1
- package/components/slider/Slider.js.map +1 -1
- package/components/smoothScrollbars/SmoothScrollbars.js +1 -1
- package/components/smoothScrollbars/SmoothScrollbars.js.map +1 -1
- package/components/spinner/Spinner.js +5 -4
- package/components/spinner/Spinner.js.map +1 -1
- package/components/states/CustomState.d.ts +69 -1
- package/components/states/CustomState.js +1 -1
- package/components/states/CustomState.js.map +1 -1
- package/components/states/EmptyState.d.ts +1 -1
- package/components/states/EmptyState.js.map +1 -1
- package/components/states/ErrorState.d.ts +1 -1
- package/components/states/ErrorState.js.map +1 -1
- package/components/states/ForbiddenState.d.ts +1 -1
- package/components/states/ForbiddenState.js.map +1 -1
- package/components/states/MaintenanceState.d.ts +1 -1
- package/components/states/MaintenanceState.js.map +1 -1
- package/components/states/NotBookedState.d.ts +1 -1
- package/components/states/NotBookedState.js.map +1 -1
- package/components/states/NotFoundState.d.ts +1 -1
- package/components/states/NotFoundState.js.map +1 -1
- package/components/states/StateButton.js +1 -1
- package/components/states/StateButton.js.map +1 -1
- package/components/statsWidget/StatsWidget.js +1 -1
- package/components/statsWidget/StatsWidget.js.map +1 -1
- package/components/statsWidget/StatsWidgetBody.js +1 -1
- package/components/statsWidget/StatsWidgetBody.js.map +1 -1
- package/components/statsWidget/StatsWidgetFooter.js +1 -1
- package/components/statsWidget/StatsWidgetFooter.js.map +1 -1
- package/components/statsWidget/StatsWidgetHeader.js +1 -1
- package/components/statsWidget/StatsWidgetHeader.js.map +1 -1
- package/components/statsWidget/StatsWidgetNumber.js +2 -2
- package/components/statsWidget/StatsWidgetNumber.js.map +1 -1
- package/components/statsWidget/StatsWidgetSpacer.js +1 -1
- package/components/statsWidget/StatsWidgetSpacer.js.map +1 -1
- package/components/statsWidget/StatsWidgets.js +1 -1
- package/components/statsWidget/StatsWidgets.js.map +1 -1
- package/components/statusBar/StatusBar.d.ts +126 -2
- package/components/statusBar/StatusBar.js +24 -17
- package/components/statusBar/StatusBar.js.map +1 -1
- package/components/statusBar/StatusBarIcon.d.ts +1 -1
- package/components/statusBar/StatusBarIcon.js +4 -4
- package/components/statusBar/StatusBarIcon.js.map +1 -1
- package/components/statusBar/StatusBarLabel.d.ts +1 -1
- package/components/statusBar/StatusBarLabel.js +5 -7
- package/components/statusBar/StatusBarLabel.js.map +1 -1
- package/components/statusBar/StatusBarProgressBar.d.ts +1 -1
- package/components/statusBar/StatusBarProgressBar.js +1 -1
- package/components/statusBar/StatusBarProgressBar.js.map +1 -1
- package/components/steppedProgressBar/SteppedProgressBar.js +1 -1
- package/components/steppedProgressBar/SteppedProgressBar.js.map +1 -1
- package/components/switch/Switch.d.ts +16 -1
- package/components/switch/Switch.js +77 -35
- package/components/switch/Switch.js.map +1 -1
- package/components/table/TableCardsSorting.js +4 -4
- package/components/table/TableCardsSorting.js.map +1 -1
- package/components/table/TableHead.js +1 -1
- package/components/table/TableHead.js.map +1 -1
- package/components/table/TableSearch.js +1 -1
- package/components/table/TableSearch.js.map +1 -1
- package/components/table/TableSettingsColumnButtons.d.ts +1 -1
- package/components/table/TableSettingsColumnButtons.js +1 -1
- package/components/table/TableSettingsColumnButtons.js.map +1 -1
- package/components/table/TableSettingsColumnDetails.d.ts +1 -1
- package/components/table/TableSettingsColumnDetails.js +1 -1
- package/components/table/TableSettingsColumnDetails.js.map +1 -1
- package/components/table/TableSettingsDialog.d.ts +51 -1
- package/components/table/TableSettingsDialog.js +170 -154
- package/components/table/TableSettingsDialog.js.map +1 -1
- package/components/table/TableSettingsDialogFooter.js +1 -1
- package/components/table/TableSettingsDialogFooter.js.map +1 -1
- package/components/table/TableSettingsListContainer.d.ts +1 -1
- package/components/table/TableSettingsListContainer.js +8 -8
- package/components/table/TableSettingsListContainer.js.map +1 -1
- package/components/table/TableSettingsListItem.d.ts +1 -1
- package/components/table/TableSettingsListItem.js +26 -26
- package/components/table/TableSettingsListItem.js.map +1 -1
- package/components/table/TableToolbar.js +1 -1
- package/components/table/TableToolbar.js.map +1 -1
- package/components/table/TableViewToggles.js +1 -1
- package/components/table/TableViewToggles.js.map +1 -1
- package/components/tag/Tag.js +1 -1
- package/components/tag/Tag.js.map +1 -1
- package/components/tag/TagList.js +1 -1
- package/components/tag/TagList.js.map +1 -1
- package/components/tagManager/CustomSuggestionItem.js +1 -1
- package/components/tagManager/CustomSuggestionItem.js.map +1 -1
- package/components/tagManager/TagManager.d.ts +14 -2
- package/components/tagManager/TagManager.js +6 -6
- package/components/tagManager/TagManager.js.map +1 -1
- package/components/tagManager/TagManagerItemList.d.ts +1 -1
- package/components/tagManager/TagManagerItemList.js +1 -1
- package/components/tagManager/TagManagerItemList.js.map +1 -1
- package/components/teaser/Teaser.js +1 -1
- package/components/teaser/Teaser.js.map +1 -1
- package/components/teaser/TeaserContainer.js +1 -1
- package/components/teaser/TeaserContainer.js.map +1 -1
- package/components/timepicker/TimePicker.d.ts +20 -0
- package/components/timepicker/TimePicker.js +153 -99
- package/components/timepicker/TimePicker.js.map +1 -1
- package/components/tooltip/Tooltip.js +1 -1
- package/components/tooltip/Tooltip.js.map +1 -1
- package/components/tracker/Tracker.d.ts +85 -0
- package/components/tracker/Tracker.js +54 -0
- package/components/tracker/Tracker.js.map +1 -0
- package/components/tracker/TrackerBlock.d.ts +11 -0
- package/components/tracker/TrackerBlock.js +34 -0
- package/components/tracker/TrackerBlock.js.map +1 -0
- package/components/video/ResponsiveVideo.js +1 -1
- package/components/video/ResponsiveVideo.js.map +1 -1
- package/hooks/useCookies.d.ts +79 -0
- package/hooks/useCookies.js +33 -0
- package/hooks/useCookies.js.map +1 -0
- package/hooks/useInterval.js +5 -5
- package/hooks/useInterval.js.map +1 -1
- package/hooks/useIsFocusWithin.js +3 -3
- package/hooks/useIsFocusWithin.js.map +1 -1
- package/hooks/useLatest.d.ts +16 -0
- package/hooks/useLatest.js +11 -0
- package/hooks/useLatest.js.map +1 -0
- package/hooks/usePostMessage.d.ts +2 -1
- package/hooks/usePostMessage.js.map +1 -1
- package/hooks/useRioCookieConsent.d.ts +49 -0
- package/hooks/useRioCookieConsent.js +44 -0
- package/hooks/useRioCookieConsent.js.map +1 -0
- package/hooks/useSearch.d.ts +1 -1
- package/hooks/useSearch.js +28 -17
- package/hooks/useSearch.js.map +1 -1
- package/hooks/useSearchHighlight.d.ts +60 -0
- package/hooks/useSearchHighlight.js +54 -0
- package/hooks/useSearchHighlight.js.map +1 -0
- package/hooks/useTimeout.js +11 -11
- package/hooks/useTimeout.js.map +1 -1
- package/hooks/useUrlState.d.ts +62 -0
- package/hooks/useUrlState.js +137 -0
- package/hooks/useUrlState.js.map +1 -0
- package/mergeClassNameOverrides.d.ts +1 -0
- package/mergeClassNameOverrides.js +5 -0
- package/mergeClassNameOverrides.js.map +1 -0
- package/package.json +17 -18
- package/routeUtils.js +11 -5
- package/routeUtils.js.map +1 -1
- package/themes/Volkswagen/components/applicationHeader/VolkswagenApplicationHeader.js +1 -1
- package/themes/Volkswagen/components/applicationHeader/VolkswagenApplicationHeader.js.map +1 -1
- package/useCookies.d.ts +2 -0
- package/useCookies.js +5 -0
- package/useCookies.js.map +1 -0
- package/useRioCookieConsent.d.ts +2 -0
- package/useRioCookieConsent.js +5 -0
- package/useRioCookieConsent.js.map +1 -0
- package/useSearchHighlight.d.ts +2 -0
- package/useSearchHighlight.js +6 -0
- package/useSearchHighlight.js.map +1 -0
- package/useUrlState.d.ts +2 -0
- package/useUrlState.js +5 -0
- package/useUrlState.js.map +1 -0
- package/utils/classNames.d.ts +3 -0
- package/utils/classNames.js +5 -0
- package/utils/classNames.js.map +1 -0
- package/utils/mergeClassNameOverrides.d.ts +1 -0
- package/utils/mergeClassNameOverrides.js +55 -0
- package/utils/mergeClassNameOverrides.js.map +1 -0
- package/utils/routeUtils.d.ts +122 -13
- package/utils/routeUtils.js +89 -31
- package/utils/routeUtils.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
- package/components/states/BaseStateProps.d.ts +0 -70
- package/components/statusBar/StatusBarProps.d.ts +0 -127
- package/components/table/TableSettingsDialog.types.d.ts +0 -39
- package/components/tagManager/TagManagerTag.d.ts +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.js","sources":["../../../src/components/timepicker/TimePicker.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useState } from 'react';\nimport { IMask, IMaskInput } from 'react-imask';\nimport type { InputMask } from 'imask';\nimport classNames from 'classnames';\nimport { noop } from 'es-toolkit/compat';\nimport { isNil } from 'es-toolkit/predicate';\nimport moment, { type Moment } from 'moment';\nimport invariant from 'tiny-invariant';\n\nconst MINUTES_OFFSET = 15;\n\nconst mask = '00:00';\nconst fullRegexp = /^(?:\\d|[01]\\d|2[0-3]):[0-5]\\d$/;\n\nconst getPadded = (value: number) => (value >= 10 ? `${value}` : `0${value}`);\nconst formatTimeString = (hours: number, minutes: number) => `${getPadded(hours)}:${getPadded(minutes)}`;\n\nconst roundedUp = (time: Moment, offset = MINUTES_OFFSET) => Math.floor(time.minutes() / offset) * offset;\n\nconst getInitialTime = () => {\n const date = new Date();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return formatTimeString(hours, minutes);\n};\n\nconst isTimeValid = (value: string) => fullRegexp.test(value);\n\nconst isControlledAndValid = (value: string | undefined): value is string => {\n const hasExternalValue = !isNil(value);\n if (!hasExternalValue) {\n return false;\n }\n\n const isValid = value === '' || isTimeValid(value);\n if (!isValid) {\n invariant(false, 'Wrong time format. Please pass in value with the following format: \"hh:mm\".');\n }\n return isValid;\n};\n\nexport type TimePickerProps = {\n /**\n * Value of the time as string. Note, when value is given the component is treated as controlled.\n */\n value?: string;\n\n /**\n * Callback function when the value changes and is a valid time format.\n *\n * If not it handles the state internally until the time is valid and filled.\n */\n onChange?: (value: string) => void;\n\n /**\n * Defines whether to always show the input mask placeholder.\n *\n * @default true\n */\n alwaysShowMask?: boolean;\n\n /**\n * Defines whether to show the input icon.\n *\n * @default false\n */\n showIcon?: boolean;\n\n /**\n * Input error message.\n */\n errorMessage?: string | React.ReactNode;\n\n /**\n * Input warning message.\n */\n warningMessage?: string | React.ReactNode;\n\n /**\n * Feedback message width.\n *\n * @default 'normal'\n */\n messageWhiteSpace?: 'normal' | 'nowrap' | 'pre-line';\n\n /**\n * Additional properties to be set on the input element.\n */\n inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>;\n\n /**\n * Additional classes to be set on the wrapper element.\n */\n className?: string;\n};\n\nconst TimePicker = (props: TimePickerProps) => {\n const {\n value,\n onChange = noop,\n alwaysShowMask = true,\n showIcon = false,\n errorMessage,\n warningMessage,\n messageWhiteSpace = 'normal',\n className = '',\n inputProps = {},\n ...remainingProps\n } = props;\n\n const initialTime = isControlledAndValid(value) ? value : getInitialTime();\n\n const [timeValue, setTimeValue] = useState(initialTime);\n\n // Update internal time value from outside when used as a controlled component\n useEffect(() => {\n if (isControlledAndValid(value)) {\n setTimeValue(value);\n onChange(value);\n }\n }, [value]);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n const input = event.target;\n // Check if value is empty or partially filled\n if (!input.value || input.value.startsWith('-')) {\n // Move cursor to the first empty position (usually 0)\n // Timeout needed to wait for IMask internal focus handling\n setTimeout(() => {\n input.setSelectionRange(0, 0);\n }, 0);\n }\n\n // If you want to preserve custom onFocus from props\n inputProps.onFocus?.(event);\n };\n\n const handleAcceptTime = (val: string, maskRef: InputMask<{ [x: string]: unknown }>) => {\n setTimeValue(val);\n\n if (maskRef.masked.isComplete) {\n onChange(val);\n }\n };\n\n const isValid = isTimeValid(timeValue);\n\n const handleIncrease = () => {\n const time = moment(`2020-01-01 ${timeValue}`);\n const rounded = roundedUp(time);\n time.minute(rounded).second(0);\n time.add(MINUTES_OFFSET, 'minutes');\n const updatedTimeValue = formatTimeString(time.hours(), time.minutes());\n\n setTimeValue(updatedTimeValue);\n onChange(updatedTimeValue);\n };\n\n const handleDecrease = () => {\n const time = moment(`2020-01-01 ${timeValue}`);\n const rounded = roundedUp(time);\n time.minute(rounded).second(0);\n time.subtract(MINUTES_OFFSET, 'minutes');\n const updatedTimeValue = formatTimeString(time.hours(), time.minutes());\n\n setTimeValue(updatedTimeValue);\n onChange(updatedTimeValue);\n };\n\n const { className: inputClassName, ...otherInputProps } = inputProps;\n\n const hasFeedback = errorMessage || warningMessage;\n\n return (\n <div {...remainingProps} className={classNames('TimePicker', 'input-group', className)}>\n {showIcon && (\n <span className='input-group-addon'>\n <span className='rioglyph rioglyph-time-alt' />\n </span>\n )}\n <div className='form-control-feedback-wrapper'>\n <IMaskInput\n {...otherInputProps}\n className={classNames('TimePickerInput', 'form-control', inputClassName)}\n // mask={mask}\n mask='HH:MM'\n blocks={{\n HH: {\n mask: IMask.MaskedRange,\n from: 0,\n to: 23,\n maxLength: 2,\n },\n MM: {\n mask: IMask.MaskedRange,\n from: 0,\n to: 59,\n maxLength: 2,\n },\n }}\n value={timeValue}\n onAccept={handleAcceptTime}\n onFocus={handleFocus}\n lazy={!alwaysShowMask}\n placeholderChar='-'\n overwrite\n />\n {hasFeedback && (\n <>\n {errorMessage && <span className='form-control-feedback rioglyph rioglyph-error-sign' />}\n {warningMessage && <span className='form-control-feedback rioglyph rioglyph-warning-sign' />}\n <span className={`help-block white-space-${messageWhiteSpace}`}>\n <span>{errorMessage || warningMessage}</span>\n </span>\n </>\n )}\n </div>\n {isValid && (\n <div className='TimePickerIncreaseButton input-group-addon'>\n <div\n className='text-color-gray hover-text-color-dark display-grid place-items-center cursor-pointer'\n onClick={handleDecrease}\n >\n <div className='rioglyph rioglyph-chevron-left scale-90' />\n </div>\n <div\n className='text-color-gray hover-text-color-dark margin-left-5 display-grid place-items-center cursor-pointer'\n onClick={handleIncrease}\n >\n <div className='rioglyph rioglyph-chevron-right scale-90' />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default TimePicker;\n"],"names":["MINUTES_OFFSET","fullRegexp","getPadded","value","formatTimeString","hours","minutes","roundedUp","time","offset","getInitialTime","date","isTimeValid","isControlledAndValid","isNil","isValid","invariant","TimePicker","props","onChange","noop","alwaysShowMask","showIcon","errorMessage","warningMessage","messageWhiteSpace","className","inputProps","remainingProps","initialTime","timeValue","setTimeValue","useState","useEffect","handleFocus","event","input","handleAcceptTime","val","maskRef","handleIncrease","moment","rounded","updatedTimeValue","handleDecrease","inputClassName","otherInputProps","hasFeedback","jsxs","classNames","jsx","IMaskInput","IMask","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimePicker.js","sources":["../../../src/components/timepicker/TimePicker.tsx"],"sourcesContent":["import type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { IMask, IMaskInput } from 'react-imask';\nimport type { InputMask } from 'imask';\nimport { noop } from 'es-toolkit/compat';\nimport { isNil } from 'es-toolkit/predicate';\nimport moment, { type Moment } from 'moment';\nimport invariant from 'tiny-invariant';\n\nimport BaseSelectDropdown, { type SelectOption } from '../selects/BaseSelectDropdown';\nimport useClickOutside from '../../useClickOutside';\nimport useMergeRefs from '../../hooks/useMergeRefs';\nimport classNames from '../../utils/classNames';\n\nconst MINUTES_OFFSET = 15;\n\nconst mask = '00:00';\nconst fullRegexp = /^(?:\\d|[01]\\d|2[0-3]):[0-5]\\d$/;\n\nconst getPadded = (value: number) => (value >= 10 ? `${value}` : `0${value}`);\nconst formatTimeString = (hours: number, minutes: number) => `${getPadded(hours)}:${getPadded(minutes)}`;\n\nconst roundedUp = (time: Moment, offset = MINUTES_OFFSET) => Math.floor(time.minutes() / offset) * offset;\nconst isValidMinuteOffset = (offset: number) => Number.isInteger(offset) && offset > 0 && offset <= 60;\nconst getEffectiveMinuteOffset = (offset: number) => (isValidMinuteOffset(offset) ? offset : MINUTES_OFFSET);\nconst getDropdownTimeValues = (offset: number) => {\n const values: string[] = [];\n const minutesPerDay = 24 * 60;\n for (let totalMinutes = 0; totalMinutes < minutesPerDay; totalMinutes += offset) {\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n values.push(formatTimeString(hours, minutes));\n }\n return values;\n};\n\nconst getInitialTime = () => {\n const date = new Date();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n return formatTimeString(hours, minutes);\n};\n\nconst isTimeValid = (value: string) => fullRegexp.test(value);\n\nconst isControlledAndValid = (value: string | undefined): value is string => {\n const hasExternalValue = !isNil(value);\n if (!hasExternalValue) {\n return false;\n }\n\n const isValid = value === '' || isTimeValid(value);\n if (!isValid) {\n invariant(false, 'Wrong time format. Please pass in value with the following format: \"hh:mm\".');\n }\n return isValid;\n};\n\nexport type TimePickerProps = {\n /**\n * Value of the time as string. Note, when value is given the component is treated as controlled.\n */\n value?: string;\n\n /**\n * Callback function when the value changes and is a valid time format.\n * It also emits an empty string when the input is cleared.\n *\n * If not it handles the state internally until the time is valid and filled.\n */\n onChange?: (value: string) => void;\n\n /**\n * Defines whether to always show the input mask placeholder.\n *\n * @default true\n */\n alwaysShowMask?: boolean;\n\n /**\n * Defines whether to show the input icon.\n *\n * @default false\n */\n showIcon?: boolean;\n\n /**\n * Defines whether to show a dropdown with pre-defined time values.\n *\n * @default false\n */\n dropdown?: boolean;\n\n /**\n * Defines the minute interval for time controls and dropdown values.\n * Invalid values fallback to 15.\n *\n * @default 15\n */\n minuteOffset?: number;\n\n /**\n * Defines whether the component is disabled.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Input error message.\n */\n errorMessage?: string | React.ReactNode;\n\n /**\n * Input warning message.\n */\n warningMessage?: string | React.ReactNode;\n\n /**\n * Feedback message width.\n *\n * @default 'normal'\n */\n messageWhiteSpace?: 'normal' | 'nowrap' | 'pre-line';\n\n /**\n * Additional properties to be set on the input element.\n */\n inputProps?: Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>;\n\n /**\n * Additional classes to be set on the wrapper element.\n */\n className?: string;\n};\n\nconst TimePicker = (props: TimePickerProps) => {\n const {\n value,\n onChange = noop,\n alwaysShowMask = true,\n showIcon = false,\n dropdown = false,\n minuteOffset = MINUTES_OFFSET,\n disabled = false,\n errorMessage,\n warningMessage,\n messageWhiteSpace = 'normal',\n className = '',\n inputProps = {},\n ...remainingProps\n } = props;\n\n const initialTime = isControlledAndValid(value) ? value : getInitialTime();\n\n const [timeValue, setTimeValue] = useState(initialTime);\n\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\n const effectiveMinuteOffset = getEffectiveMinuteOffset(minuteOffset);\n\n const isInputDisabled = disabled || !!inputProps.disabled;\n const timePickerRef = useRef<HTMLDivElement>(null);\n const hasMountedRef = useRef(false);\n const suppressNextAcceptRef = useRef(false);\n\n const clickOutsideRef = useClickOutside(() => {\n if (dropdown) {\n setIsDropdownOpen(false);\n }\n });\n\n const mergedTimePickerRefs = useMergeRefs(timePickerRef, clickOutsideRef);\n\n // Update internal time value from outside when used as a controlled component\n useEffect(() => {\n if (isControlledAndValid(value)) {\n setTimeValue(value);\n }\n }, [value]);\n\n useEffect(() => {\n hasMountedRef.current = true;\n\n return () => {\n hasMountedRef.current = false;\n };\n }, []);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n const input = event.target;\n // Check if value is empty or partially filled\n if (!input.value || input.value.startsWith('-')) {\n // Move cursor to the first empty position (usually 0)\n // Timeout needed to wait for IMask internal focus handling\n setTimeout(() => {\n input.setSelectionRange(0, 0);\n }, 0);\n }\n\n // If you want to preserve custom onFocus from props\n inputProps.onFocus?.(event);\n\n if (dropdown && !isInputDisabled) {\n setIsDropdownOpen(true);\n }\n };\n\n const handleAcceptTime = (val: string, maskRef: InputMask<{ [x: string]: unknown }>) => {\n if (suppressNextAcceptRef.current) {\n suppressNextAcceptRef.current = false;\n return;\n }\n\n setTimeValue(val);\n\n if (!hasMountedRef.current) {\n return;\n }\n\n if (maskRef.masked.isComplete) {\n onChange(val);\n return;\n }\n\n if (maskRef.unmaskedValue === '') {\n onChange('');\n }\n };\n\n const isValid = isTimeValid(timeValue);\n\n const handleIncrease = () => {\n const time = moment(`2020-01-01 ${timeValue}`);\n const rounded = roundedUp(time, effectiveMinuteOffset);\n time.minute(rounded).second(0);\n time.add(effectiveMinuteOffset, 'minutes');\n const updatedTimeValue = formatTimeString(time.hours(), time.minutes());\n\n setTimeValue(updatedTimeValue);\n };\n\n const handleDecrease = () => {\n const time = moment(`2020-01-01 ${timeValue}`);\n const rounded = roundedUp(time, effectiveMinuteOffset);\n time.minute(rounded).second(0);\n time.subtract(effectiveMinuteOffset, 'minutes');\n const updatedTimeValue = formatTimeString(time.hours(), time.minutes());\n\n setTimeValue(updatedTimeValue);\n };\n\n const { className: inputClassName, ...otherInputProps } = inputProps;\n\n const dropdownOptions: SelectOption[] = getDropdownTimeValues(effectiveMinuteOffset).map(option => ({\n id: option,\n label: option,\n selected: option === timeValue,\n }));\n\n const handleSelectDropdownValue = (selectedItem: SelectOption | undefined) => {\n if (!selectedItem || isInputDisabled) {\n return;\n }\n\n suppressNextAcceptRef.current = true;\n setTimeValue(selectedItem.id);\n onChange(selectedItem.id);\n setIsDropdownOpen(false);\n };\n\n const hasFeedback = errorMessage || warningMessage;\n\n const wrapperClassName = classNames('TimePicker', dropdown && 'dropdown', isDropdownOpen && 'open', className);\n\n return (\n <div {...remainingProps} className={wrapperClassName} ref={mergedTimePickerRefs}>\n <div className='input-group'>\n {showIcon && (\n <span className='input-group-addon'>\n <span className='rioglyph rioglyph-time-alt' />\n </span>\n )}\n <div className='form-control-feedback-wrapper'>\n <IMaskInput\n {...otherInputProps}\n className={classNames('TimePickerInput', 'form-control', inputClassName)}\n disabled={isInputDisabled}\n mask='HH:MM'\n blocks={{\n HH: {\n mask: IMask.MaskedRange,\n from: 0,\n to: 23,\n maxLength: 2,\n },\n MM: {\n mask: IMask.MaskedRange,\n from: 0,\n to: 59,\n maxLength: 2,\n },\n }}\n value={timeValue}\n onAccept={handleAcceptTime}\n onFocus={handleFocus}\n lazy={!alwaysShowMask}\n placeholderChar='-'\n overwrite\n />\n {hasFeedback && (\n <>\n {errorMessage && <span className='form-control-feedback rioglyph rioglyph-error-sign' />}\n {warningMessage && (\n <span className='form-control-feedback rioglyph rioglyph-warning-sign' />\n )}\n <span className={`help-block white-space-${messageWhiteSpace}`}>\n <span>{errorMessage || warningMessage}</span>\n </span>\n </>\n )}\n </div>\n {isValid && (\n <div\n className={classNames(\n 'TimePickerIncreaseButton input-group-addon',\n isInputDisabled && 'pointer-events-none bg-lightest'\n )}\n >\n <div\n className='text-color-gray hover-text-color-dark display-grid place-items-center cursor-pointer'\n onClick={handleDecrease}\n >\n <div className='rioglyph rioglyph-chevron-left scale-90' />\n </div>\n <div\n className='text-color-gray hover-text-color-dark margin-left-5 display-grid place-items-center cursor-pointer'\n onClick={handleIncrease}\n >\n <div className='rioglyph rioglyph-chevron-right scale-90' />\n </div>\n </div>\n )}\n </div>\n {dropdown && (\n <BaseSelectDropdown\n isOpen={isDropdownOpen}\n options={dropdownOptions}\n onSelect={handleSelectDropdownValue}\n dropdownClassName='max-height-200 overflow-auto width-100pct'\n />\n )}\n </div>\n );\n};\n\nexport default TimePicker;\n"],"names":["MINUTES_OFFSET","fullRegexp","getPadded","value","formatTimeString","hours","minutes","roundedUp","time","offset","isValidMinuteOffset","getEffectiveMinuteOffset","getDropdownTimeValues","values","totalMinutes","getInitialTime","date","isTimeValid","isControlledAndValid","isNil","isValid","invariant","TimePicker","props","onChange","noop","alwaysShowMask","showIcon","dropdown","minuteOffset","disabled","errorMessage","warningMessage","messageWhiteSpace","className","inputProps","remainingProps","initialTime","timeValue","setTimeValue","useState","isDropdownOpen","setIsDropdownOpen","effectiveMinuteOffset","isInputDisabled","timePickerRef","useRef","hasMountedRef","suppressNextAcceptRef","clickOutsideRef","useClickOutside","mergedTimePickerRefs","useMergeRefs","useEffect","handleFocus","event","input","handleAcceptTime","val","maskRef","handleIncrease","moment","rounded","updatedTimeValue","handleDecrease","inputClassName","otherInputProps","dropdownOptions","option","handleSelectDropdownValue","selectedItem","hasFeedback","wrapperClassName","classNames","jsxs","jsx","IMaskInput","IMask","Fragment","BaseSelectDropdown"],"mappings":";;;;;;;;;;;AAcA,MAAMA,IAAiB,IAGjBC,KAAa,kCAEbC,IAAY,CAACC,MAAmBA,KAAS,KAAK,GAAGA,CAAK,KAAK,IAAIA,CAAK,IACpEC,IAAmB,CAACC,GAAeC,MAAoB,GAAGJ,EAAUG,CAAK,CAAC,IAAIH,EAAUI,CAAO,CAAC,IAEhGC,IAAY,CAACC,GAAcC,IAAST,MAAmB,KAAK,MAAMQ,EAAK,YAAYC,CAAM,IAAIA,GAC7FC,KAAsB,CAACD,MAAmB,OAAO,UAAUA,CAAM,KAAKA,IAAS,KAAKA,KAAU,IAC9FE,KAA2B,CAACF,MAAoBC,GAAoBD,CAAM,IAAIA,IAAST,GACvFY,KAAwB,CAACH,MAAmB;AAC9C,QAAMI,IAAmB,CAAA;AAEzB,WAASC,IAAe,GAAGA,IAAe,MAAeA,KAAgBL,GAAQ;AAC7E,UAAMJ,IAAQ,KAAK,MAAMS,IAAe,EAAE,GACpCR,IAAUQ,IAAe;AAC/B,IAAAD,EAAO,KAAKT,EAAiBC,GAAOC,CAAO,CAAC;AAAA,EAChD;AACA,SAAOO;AACX,GAEME,KAAiB,MAAM;AACzB,QAAMC,wBAAW,KAAA,GACXX,IAAQW,EAAK,SAAA,GACbV,IAAUU,EAAK,WAAA;AACrB,SAAOZ,EAAiBC,GAAOC,CAAO;AAC1C,GAEMW,IAAc,CAACd,MAAkBF,GAAW,KAAKE,CAAK,GAEtDe,IAAuB,CAACf,MAA+C;AAEzE,MAAI,CADqB,CAACgB,GAAMhB,CAAK;AAEjC,WAAO;AAGX,QAAMiB,IAAUjB,MAAU,MAAMc,EAAYd,CAAK;AACjD,SAAKiB,KACDC,GAAU,IAAO,6EAA6E,GAE3FD;AACX,GAgFME,KAAa,CAACC,MAA2B;AAC3C,QAAM;AAAA,IACF,OAAApB;AAAA,IACA,UAAAqB,IAAWC;AAAA,IACX,gBAAAC,IAAiB;AAAA,IACjB,UAAAC,IAAW;AAAA,IACX,UAAAC,IAAW;AAAA,IACX,cAAAC,IAAe7B;AAAA,IACf,UAAA8B,IAAW;AAAA,IACX,cAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC,IAAoB;AAAA,IACpB,WAAAC,IAAY;AAAA,IACZ,YAAAC,IAAa,CAAA;AAAA,IACb,GAAGC;AAAA,EAAA,IACHb,GAEEc,IAAcnB,EAAqBf,CAAK,IAAIA,IAAQY,GAAA,GAEpD,CAACuB,GAAWC,CAAY,IAAIC,EAASH,CAAW,GAEhD,CAACI,GAAgBC,CAAiB,IAAIF,EAAS,EAAK,GAEpDG,IAAwBhC,GAAyBkB,CAAY,GAE7De,IAAkBd,KAAY,CAAC,CAACK,EAAW,UAC3CU,IAAgBC,EAAuB,IAAI,GAC3CC,IAAgBD,EAAO,EAAK,GAC5BE,IAAwBF,EAAO,EAAK,GAEpCG,IAAkBC,GAAgB,MAAM;AAC1C,IAAItB,KACAc,EAAkB,EAAK;AAAA,EAE/B,CAAC,GAEKS,IAAuBC,GAAaP,GAAeI,CAAe;AAGxE,EAAAI,EAAU,MAAM;AACZ,IAAInC,EAAqBf,CAAK,KAC1BoC,EAAapC,CAAK;AAAA,EAE1B,GAAG,CAACA,CAAK,CAAC,GAEVkD,EAAU,OACNN,EAAc,UAAU,IAEjB,MAAM;AACT,IAAAA,EAAc,UAAU;AAAA,EAC5B,IACD,CAAA,CAAE;AAEL,QAAMO,IAAc,CAACC,MAA8C;AAC/D,UAAMC,IAAQD,EAAM;AAEpB,KAAI,CAACC,EAAM,SAASA,EAAM,MAAM,WAAW,GAAG,MAG1C,WAAW,MAAM;AACb,MAAAA,EAAM,kBAAkB,GAAG,CAAC;AAAA,IAChC,GAAG,CAAC,GAIRrB,EAAW,UAAUoB,CAAK,GAEtB3B,KAAY,CAACgB,KACbF,EAAkB,EAAI;AAAA,EAE9B,GAEMe,IAAmB,CAACC,GAAaC,MAAiD;AACpF,QAAIX,EAAsB,SAAS;AAC/B,MAAAA,EAAsB,UAAU;AAChC;AAAA,IACJ;AAIA,QAFAT,EAAamB,CAAG,GAEZ,EAACX,EAAc,SAInB;AAAA,UAAIY,EAAQ,OAAO,YAAY;AAC3B,QAAAnC,EAASkC,CAAG;AACZ;AAAA,MACJ;AAEA,MAAIC,EAAQ,kBAAkB,MAC1BnC,EAAS,EAAE;AAAA;AAAA,EAEnB,GAEMJ,IAAUH,EAAYqB,CAAS,GAE/BsB,IAAiB,MAAM;AACzB,UAAMpD,IAAOqD,EAAO,cAAcvB,CAAS,EAAE,GACvCwB,IAAUvD,EAAUC,GAAMmC,CAAqB;AACrD,IAAAnC,EAAK,OAAOsD,CAAO,EAAE,OAAO,CAAC,GAC7BtD,EAAK,IAAImC,GAAuB,SAAS;AACzC,UAAMoB,IAAmB3D,EAAiBI,EAAK,SAASA,EAAK,SAAS;AAEtE,IAAA+B,EAAawB,CAAgB;AAAA,EACjC,GAEMC,IAAiB,MAAM;AACzB,UAAMxD,IAAOqD,EAAO,cAAcvB,CAAS,EAAE,GACvCwB,IAAUvD,EAAUC,GAAMmC,CAAqB;AACrD,IAAAnC,EAAK,OAAOsD,CAAO,EAAE,OAAO,CAAC,GAC7BtD,EAAK,SAASmC,GAAuB,SAAS;AAC9C,UAAMoB,IAAmB3D,EAAiBI,EAAK,SAASA,EAAK,SAAS;AAEtE,IAAA+B,EAAawB,CAAgB;AAAA,EACjC,GAEM,EAAE,WAAWE,GAAgB,GAAGC,MAAoB/B,GAEpDgC,IAAkCvD,GAAsB+B,CAAqB,EAAE,IAAI,CAAAyB,OAAW;AAAA,IAChG,IAAIA;AAAA,IACJ,OAAOA;AAAA,IACP,UAAUA,MAAW9B;AAAA,EAAA,EACvB,GAEI+B,IAA4B,CAACC,MAA2C;AAC1E,IAAI,CAACA,KAAgB1B,MAIrBI,EAAsB,UAAU,IAChCT,EAAa+B,EAAa,EAAE,GAC5B9C,EAAS8C,EAAa,EAAE,GACxB5B,EAAkB,EAAK;AAAA,EAC3B,GAEM6B,IAAcxC,KAAgBC,GAE9BwC,IAAmBC,EAAW,cAAc7C,KAAY,YAAYa,KAAkB,QAAQP,CAAS;AAE7G,2BACK,OAAA,EAAK,GAAGE,GAAgB,WAAWoC,GAAkB,KAAKrB,GACvD,UAAA;AAAA,IAAA,gBAAAuB,EAAC,OAAA,EAAI,WAAU,eACV,UAAA;AAAA,MAAA/C,KACG,gBAAAgD,EAAC,UAAK,WAAU,qBACZ,4BAAC,QAAA,EAAK,WAAU,8BAA6B,EAAA,CACjD;AAAA,MAEJ,gBAAAD,EAAC,OAAA,EAAI,WAAU,iCACX,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACI,GAAGV;AAAA,YACJ,WAAWO,EAAW,mBAAmB,gBAAgBR,CAAc;AAAA,YACvE,UAAUrB;AAAA,YACV,MAAK;AAAA,YACL,QAAQ;AAAA,cACJ,IAAI;AAAA,gBACA,MAAMiC,EAAM;AAAA,gBACZ,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,WAAW;AAAA,cAAA;AAAA,cAEf,IAAI;AAAA,gBACA,MAAMA,EAAM;AAAA,gBACZ,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,WAAW;AAAA,cAAA;AAAA,YACf;AAAA,YAEJ,OAAOvC;AAAA,YACP,UAAUmB;AAAA,YACV,SAASH;AAAA,YACT,MAAM,CAAC5B;AAAA,YACP,iBAAgB;AAAA,YAChB,WAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ6C,KACG,gBAAAG,EAAAI,IAAA,EACK,UAAA;AAAA,UAAA/C,KAAgB,gBAAA4C,EAAC,QAAA,EAAK,WAAU,qDAAA,CAAqD;AAAA,UACrF3C,KACG,gBAAA2C,EAAC,QAAA,EAAK,WAAU,uDAAA,CAAuD;AAAA,UAE3E,gBAAAA,EAAC,QAAA,EAAK,WAAW,0BAA0B1C,CAAiB,IACxD,UAAA,gBAAA0C,EAAC,QAAA,EAAM,UAAA5C,KAAgBC,EAAA,CAAe,EAAA,CAC1C;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,GAER;AAAA,MACCZ,KACG,gBAAAsD;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAWD;AAAA,YACP;AAAA,YACA7B,KAAmB;AAAA,UAAA;AAAA,UAGvB,UAAA;AAAA,YAAA,gBAAA+B;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,SAASX;AAAA,gBAET,UAAA,gBAAAW,EAAC,OAAA,EAAI,WAAU,0CAAA,CAA0C;AAAA,cAAA;AAAA,YAAA;AAAA,YAE7D,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,SAASf;AAAA,gBAET,UAAA,gBAAAe,EAAC,OAAA,EAAI,WAAU,2CAAA,CAA2C;AAAA,cAAA;AAAA,YAAA;AAAA,UAC9D;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ,GAER;AAAA,IACC/C,KACG,gBAAA+C;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,QAAQtC;AAAA,QACR,SAAS0B;AAAA,QACT,UAAUE;AAAA,QACV,mBAAkB;AAAA,MAAA;AAAA,IAAA;AAAA,EACtB,GAER;AAER;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as t, jsxs as M } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as I, useState as w, useEffect as G } from "react";
|
|
3
|
-
import l from "classnames";
|
|
4
3
|
import { omit as g } from "es-toolkit/compat";
|
|
4
|
+
import l from "../../utils/classNames.js";
|
|
5
5
|
import { isDesktop as h } from "../../utils/deviceUtils.js";
|
|
6
6
|
import { PLACEMENT as x } from "../../values/Placement.js";
|
|
7
7
|
import { TEXT_ALIGNMENT as o } from "../../values/TextAlignment.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n useEffect,\n useState,\n forwardRef,\n type CSSProperties,\n type ForwardedRef,\n type PropsWithChildren,\n type HTMLAttributes,\n} from 'react';\nimport
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n useEffect,\n useState,\n forwardRef,\n type CSSProperties,\n type ForwardedRef,\n type PropsWithChildren,\n type HTMLAttributes,\n} from 'react';\nimport { omit } from 'es-toolkit/compat';\n\nimport classNames from '../../utils/classNames';\nimport { isDesktop } from '../../utils/deviceUtils';\nimport { PLACEMENT } from '../../values/Placement';\nimport { TEXT_ALIGNMENT } from '../../values/TextAlignment';\nimport type { ObjectValues } from '../../utils/ObjectValues';\nimport type { RefComponent } from '../../utils/RefComponent';\n\nconst STYLE_MAP = {\n STYLE_DEFAULT: 'default',\n STYLE_ONBOARDING: 'onboarding',\n} as const;\n\nconst TEXT_ALIGNMENT_MAP = {\n TEXT_ALIGNMENT_LEFT: TEXT_ALIGNMENT.LEFT,\n TEXT_ALIGNMENT_CENTER: TEXT_ALIGNMENT.CENTER,\n TEXT_ALIGNMENT_RIGHT: TEXT_ALIGNMENT.RIGHT,\n} as const;\n\nexport type TooltipWidth = 'auto' | 100 | 150 | 200 | 250 | 300 | 350 | 400 | 450 | 500;\n\nexport type TooltipProps = {\n /**\n * An HTML id attribute, necessary for accessibility.\n */\n id?: string;\n\n /**\n * Sets the direction the Tooltip is positioned towards. This is generally provided by the\n * OverlayTrigger component positioning the tooltip.\n *\n * @default 'bottom'\n */\n placement?: ObjectValues<typeof PLACEMENT>;\n\n /**\n * Defines the position of the text content.\n *\n * Possible values are:\n *\n * - `'center'`\n * - `'left'`\n * - `'right'`\n *\n * @default 'center'\n */\n textAlignment?: ObjectValues<typeof TEXT_ALIGNMENT>;\n\n /**\n * Defines the look of the tooltip.\n * Possible values are: `default` and `onboarding`\n *\n * @default 'default'\n */\n tooltipStyle?: ObjectValues<typeof STYLE_MAP>;\n\n /**\n * Defines the width of 'the tooltip.\n * Possible values are:\n *\n * - `'auto'`\n * - `100`\n * - `150`\n * - `200`\n * - `250`\n * - `300`\n * - `350`\n * - `400`\n * - `450`\n * - `500`\n */\n width?: TooltipWidth;\n\n /**\n * Render Tooltips on mobile devices.\n *\n * @default false\n */\n allowOnTouch?: boolean;\n\n /**\n * Additional props assigned to the arrow element. Internally used.\n */\n arrowProps?: Record<string, unknown>;\n\n /**\n * Additional style properties assigned to the wrapper element.\n */\n style?: CSSProperties;\n\n /**\n * Additional classes to be set on the wrapper element.\n */\n className?: string;\n\n /**\n * Additional classes to be set on the inner element.\n */\n innerClassName?: string;\n} & Omit<HTMLAttributes<HTMLDivElement>, 'id' | 'style' | 'className'>;\n\nexport type TooltipType = RefComponent<PropsWithChildren<TooltipProps>> &\n typeof STYLE_MAP &\n typeof PLACEMENT &\n typeof TEXT_ALIGNMENT_MAP;\n\nconst Tooltip = forwardRef((props: PropsWithChildren<TooltipProps>, ref: ForwardedRef<HTMLDivElement>) => {\n const {\n allowOnTouch = false,\n arrowProps,\n children,\n className = '',\n innerClassName = '',\n placement = 'bottom',\n style,\n textAlignment = 'center',\n tooltipStyle = 'default',\n width = 'auto',\n ...remainingProps\n } = omit(props, ['popper', 'positionLeft', 'positionTop']);\n\n // Mount the component but don't show it yet via CSS.\n // After it is mounted, we set the visibility class to use CSS animation\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => setIsMounted(true), []);\n\n if (!isDesktop() && !allowOnTouch) {\n // Workaround: we have to return a DOM node as otherwise the\n // react-transition library would throw an error on mobile\n // when triggering a browser reflow and accessing the node directly.\n return <span className='display-none' />;\n }\n\n const wrapperClasses = classNames(\n 'tooltip',\n tooltipStyle && `tooltip-${tooltipStyle}`,\n placement,\n 'fade',\n isMounted && 'show',\n className\n );\n\n const innerClasses = classNames(\n 'tooltip-inner',\n textAlignment && `text-${textAlignment}`,\n width && `width-${width}`,\n innerClassName && innerClassName\n );\n\n /* eslint-disable react/no-unknown-property */\n return (\n <div\n {...remainingProps}\n role='tooltip'\n // x-placement is used by the css to define how to position the arrow.\n x-placement={placement}\n ref={ref}\n className={wrapperClasses}\n style={{ ...style }}\n data-offset={20}\n >\n <div className='tooltip-arrow' {...arrowProps} />\n <div className={innerClasses}>{children}</div>\n </div>\n );\n}) as TooltipType;\n\n// statics\nObject.assign(Tooltip, STYLE_MAP);\nObject.assign(Tooltip, PLACEMENT); // is keyed as-is\nObject.assign(Tooltip, TEXT_ALIGNMENT_MAP);\n\nexport default Tooltip;\n"],"names":["STYLE_MAP","TEXT_ALIGNMENT_MAP","TEXT_ALIGNMENT","Tooltip","forwardRef","props","ref","allowOnTouch","arrowProps","children","className","innerClassName","placement","style","textAlignment","tooltipStyle","width","remainingProps","omit","isMounted","setIsMounted","useState","useEffect","isDesktop","jsx","wrapperClasses","classNames","innerClasses","jsxs","PLACEMENT"],"mappings":";;;;;;;AAkBA,MAAMA,IAAY;AAAA,EACd,eAAe;AAAA,EACf,kBAAkB;AACtB,GAEMC,IAAqB;AAAA,EACvB,qBAAqBC,EAAe;AAAA,EACpC,uBAAuBA,EAAe;AAAA,EACtC,sBAAsBA,EAAe;AACzC,GAyFMC,IAAUC,EAAW,CAACC,GAAwCC,MAAsC;AACtG,QAAM;AAAA,IACF,cAAAC,IAAe;AAAA,IACf,YAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,gBAAAC,IAAiB;AAAA,IACjB,WAAAC,IAAY;AAAA,IACZ,OAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,cAAAC,IAAe;AAAA,IACf,OAAAC,IAAQ;AAAA,IACR,GAAGC;AAAA,EAAA,IACHC,EAAKb,GAAO,CAAC,UAAU,gBAAgB,aAAa,CAAC,GAInD,CAACc,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAGhD,MAFAC,EAAU,MAAMF,EAAa,EAAI,GAAG,CAAA,CAAE,GAElC,CAACG,OAAe,CAAChB;AAIjB,WAAO,gBAAAiB,EAAC,QAAA,EAAK,WAAU,eAAA,CAAe;AAG1C,QAAMC,IAAiBC;AAAA,IACnB;AAAA,IACAX,KAAgB,WAAWA,CAAY;AAAA,IACvCH;AAAA,IACA;AAAA,IACAO,KAAa;AAAA,IACbT;AAAA,EAAA,GAGEiB,IAAeD;AAAA,IACjB;AAAA,IACAZ,KAAiB,QAAQA,CAAa;AAAA,IACtCE,KAAS,SAASA,CAAK;AAAA,IACvBL,KAAkBA;AAAA,EAAA;AAItB,SACI,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAGX;AAAA,MACJ,MAAK;AAAA,MAEL,eAAaL;AAAA,MACb,KAAAN;AAAA,MACA,WAAWmB;AAAA,MACX,OAAO,EAAE,GAAGZ,EAAA;AAAA,MACZ,eAAa;AAAA,MAEb,UAAA;AAAA,QAAA,gBAAAW,EAAC,OAAA,EAAI,WAAU,iBAAiB,GAAGhB,EAAA,CAAY;AAAA,QAC/C,gBAAAgB,EAAC,OAAA,EAAI,WAAWG,GAAe,UAAAlB,EAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGpD,CAAC;AAGD,OAAO,OAAON,GAASH,CAAS;AAChC,OAAO,OAAOG,GAAS0B,CAAS;AAChC,OAAO,OAAO1B,GAASF,CAAkB;"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export type TrackerBlock = {
|
|
3
|
+
/**
|
|
4
|
+
* Unique identifier for a block.
|
|
5
|
+
*/
|
|
6
|
+
id?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Defines the block color by setting a UIKIT bg-<name> class.
|
|
9
|
+
*/
|
|
10
|
+
color?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Tooltip content shown on hover.
|
|
13
|
+
*/
|
|
14
|
+
tooltip?: ReactNode;
|
|
15
|
+
/**
|
|
16
|
+
* Called when clicking the block.
|
|
17
|
+
*/
|
|
18
|
+
onClick?: (id: string) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Additional class names for the block.
|
|
21
|
+
*/
|
|
22
|
+
className?: string;
|
|
23
|
+
};
|
|
24
|
+
export type TrackerProps = {
|
|
25
|
+
/**
|
|
26
|
+
* Array of block objects.
|
|
27
|
+
*/
|
|
28
|
+
data: TrackerBlock[];
|
|
29
|
+
/**
|
|
30
|
+
* Background color of a block, when no color is provided in `data`.
|
|
31
|
+
*
|
|
32
|
+
* @default 'bg-success'
|
|
33
|
+
*/
|
|
34
|
+
defaultBackgroundColor?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Add a hover effect to the tracker blocks.
|
|
37
|
+
*
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
40
|
+
hoverEffect?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Minimum width per tracker block in pixels.
|
|
43
|
+
*
|
|
44
|
+
* The tracker compresses blocks automatically down to this value.
|
|
45
|
+
*
|
|
46
|
+
* @default 5
|
|
47
|
+
*/
|
|
48
|
+
minBlockWidth?: number;
|
|
49
|
+
/**
|
|
50
|
+
* Maximum width per tracker block in pixels.
|
|
51
|
+
*
|
|
52
|
+
* @default 10
|
|
53
|
+
*/
|
|
54
|
+
maxBlockWidth?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Gap between tracker blocks in pixels.
|
|
57
|
+
*
|
|
58
|
+
* @default 2
|
|
59
|
+
*/
|
|
60
|
+
blockGap?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Height per tracker block in pixels.
|
|
63
|
+
*
|
|
64
|
+
* @default 30
|
|
65
|
+
*/
|
|
66
|
+
blockHeight?: number;
|
|
67
|
+
/**
|
|
68
|
+
* When enabled, the tracker shows fewer blocks once `minBlockWidth` is reached.
|
|
69
|
+
*
|
|
70
|
+
* @default true
|
|
71
|
+
*/
|
|
72
|
+
collapseOnMinBlockWidth?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Show the last blocks instead of the first blocks when collapsing due to width.
|
|
75
|
+
*
|
|
76
|
+
* @default false
|
|
77
|
+
*/
|
|
78
|
+
collapseShowLastBlocks?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Additional class names on the wrapper element.
|
|
81
|
+
*/
|
|
82
|
+
className?: string;
|
|
83
|
+
};
|
|
84
|
+
declare const Tracker: (props: TrackerProps) => import("react/jsx-runtime").JSX.Element;
|
|
85
|
+
export default Tracker;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as m } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo as T } from "react";
|
|
3
|
+
import C from "../../utils/classNames.js";
|
|
4
|
+
import H from "../../hooks/useResizeObserver.js";
|
|
5
|
+
import A from "./TrackerBlock.js";
|
|
6
|
+
const E = 5, O = 10, F = 2, G = 30, R = (d) => {
|
|
7
|
+
const {
|
|
8
|
+
data: t,
|
|
9
|
+
defaultBackgroundColor: k = "bg-success",
|
|
10
|
+
hoverEffect: p = !1,
|
|
11
|
+
minBlockWidth: M = E,
|
|
12
|
+
maxBlockWidth: b = O,
|
|
13
|
+
blockGap: B = F,
|
|
14
|
+
blockHeight: W = G,
|
|
15
|
+
collapseOnMinBlockWidth: n = !0,
|
|
16
|
+
collapseShowLastBlocks: r = !1,
|
|
17
|
+
className: f
|
|
18
|
+
} = d, [g, I, { inlineSize: h }] = H(), c = Math.max(1, M), l = Math.max(c, b), a = Math.max(0, B), x = Math.max(1, W), { visibleData: u, blockWidth: _ } = T(() => {
|
|
19
|
+
if (t.length === 0)
|
|
20
|
+
return { visibleData: t, blockWidth: l };
|
|
21
|
+
const e = h ?? t.length * l + (t.length - 1) * a, s = Math.max(
|
|
22
|
+
1,
|
|
23
|
+
Math.floor((e + a) / (c + a))
|
|
24
|
+
), o = n ? Math.min(t.length, s) : t.length, i = r ? t.slice(-o) : t.slice(0, o), D = Math.max(0, e - (i.length - 1) * a) / i.length, L = Math.max(c, Math.min(l, D));
|
|
25
|
+
return { visibleData: i, blockWidth: L };
|
|
26
|
+
}, [
|
|
27
|
+
t,
|
|
28
|
+
h,
|
|
29
|
+
c,
|
|
30
|
+
l,
|
|
31
|
+
a,
|
|
32
|
+
n,
|
|
33
|
+
r
|
|
34
|
+
]), v = C("tracker", f);
|
|
35
|
+
return /* @__PURE__ */ m("div", { ref: g, className: v, style: { gap: `${a}px` }, children: u.map((e, s) => {
|
|
36
|
+
const o = e.id ?? `${s}`;
|
|
37
|
+
return /* @__PURE__ */ m(
|
|
38
|
+
A,
|
|
39
|
+
{
|
|
40
|
+
id: o,
|
|
41
|
+
block: e,
|
|
42
|
+
defaultBackgroundColor: k,
|
|
43
|
+
hoverEffect: p,
|
|
44
|
+
blockWidth: _,
|
|
45
|
+
blockHeight: x
|
|
46
|
+
},
|
|
47
|
+
o
|
|
48
|
+
);
|
|
49
|
+
}) });
|
|
50
|
+
};
|
|
51
|
+
export {
|
|
52
|
+
R as default
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=Tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tracker.js","sources":["../../../src/components/tracker/Tracker.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\n\nimport classNames from '../../utils/classNames';\nimport useResizeObserver from '../../hooks/useResizeObserver';\nimport TrackerBlockItem from './TrackerBlock';\n\nconst DEFAULT_MIN_BLOCK_WIDTH = 5;\nconst DEFAULT_MAX_BLOCK_WIDTH = 10;\nconst DEFAULT_BLOCK_GAP = 2;\nconst DEFAULT_BLOCK_HEIGHT = 30;\n\nexport type TrackerBlock = {\n /**\n * Unique identifier for a block.\n */\n id?: string;\n\n /**\n * Defines the block color by setting a UIKIT bg-<name> class.\n */\n color?: string;\n\n /**\n * Tooltip content shown on hover.\n */\n tooltip?: ReactNode;\n\n /**\n * Called when clicking the block.\n */\n onClick?: (id: string) => void;\n\n /**\n * Additional class names for the block.\n */\n className?: string;\n};\n\nexport type TrackerProps = {\n /**\n * Array of block objects.\n */\n data: TrackerBlock[];\n\n /**\n * Background color of a block, when no color is provided in `data`.\n *\n * @default 'bg-success'\n */\n defaultBackgroundColor?: string;\n\n /**\n * Add a hover effect to the tracker blocks.\n *\n * @default false\n */\n hoverEffect?: boolean;\n\n /**\n * Minimum width per tracker block in pixels.\n *\n * The tracker compresses blocks automatically down to this value.\n *\n * @default 5\n */\n minBlockWidth?: number;\n\n /**\n * Maximum width per tracker block in pixels.\n *\n * @default 10\n */\n maxBlockWidth?: number;\n\n /**\n * Gap between tracker blocks in pixels.\n *\n * @default 2\n */\n blockGap?: number;\n\n /**\n * Height per tracker block in pixels.\n *\n * @default 30\n */\n blockHeight?: number;\n\n /**\n * When enabled, the tracker shows fewer blocks once `minBlockWidth` is reached.\n *\n * @default true\n */\n collapseOnMinBlockWidth?: boolean;\n\n /**\n * Show the last blocks instead of the first blocks when collapsing due to width.\n *\n * @default false\n */\n collapseShowLastBlocks?: boolean;\n\n /**\n * Additional class names on the wrapper element.\n */\n className?: string;\n};\n\nconst Tracker = (props: TrackerProps) => {\n const {\n data,\n defaultBackgroundColor = 'bg-success',\n hoverEffect = false,\n minBlockWidth = DEFAULT_MIN_BLOCK_WIDTH,\n maxBlockWidth = DEFAULT_MAX_BLOCK_WIDTH,\n blockGap = DEFAULT_BLOCK_GAP,\n blockHeight = DEFAULT_BLOCK_HEIGHT,\n collapseOnMinBlockWidth = true,\n collapseShowLastBlocks = false,\n className,\n } = props;\n const [trackerRef, _, { inlineSize }] = useResizeObserver<HTMLDivElement>();\n\n const clampedMinBlockWidth = Math.max(1, minBlockWidth);\n const clampedMaxBlockWidth = Math.max(clampedMinBlockWidth, maxBlockWidth);\n const clampedBlockGap = Math.max(0, blockGap);\n const clampedBlockHeight = Math.max(1, blockHeight);\n\n const { visibleData, blockWidth } = useMemo(() => {\n if (data.length === 0) {\n return { visibleData: data, blockWidth: clampedMaxBlockWidth };\n }\n\n const containerWidth = inlineSize ?? data.length * clampedMaxBlockWidth + (data.length - 1) * clampedBlockGap;\n const maxVisibleWithMinWidth = Math.max(\n 1,\n Math.floor((containerWidth + clampedBlockGap) / (clampedMinBlockWidth + clampedBlockGap))\n );\n const visibleBlocksCount = collapseOnMinBlockWidth\n ? Math.min(data.length, maxVisibleWithMinWidth)\n : data.length;\n const visibleData = collapseShowLastBlocks\n ? data.slice(-visibleBlocksCount)\n : data.slice(0, visibleBlocksCount);\n\n const availableWidth = Math.max(0, containerWidth - (visibleData.length - 1) * clampedBlockGap);\n const widthPerBlock = availableWidth / visibleData.length;\n const blockWidth = Math.max(clampedMinBlockWidth, Math.min(clampedMaxBlockWidth, widthPerBlock));\n\n return { visibleData, blockWidth };\n }, [\n data,\n inlineSize,\n clampedMinBlockWidth,\n clampedMaxBlockWidth,\n clampedBlockGap,\n collapseOnMinBlockWidth,\n collapseShowLastBlocks,\n ]);\n\n const wrapperClasses = classNames('tracker', className);\n\n return (\n <div ref={trackerRef} className={wrapperClasses} style={{ gap: `${clampedBlockGap}px` }}>\n {visibleData.map((block, index) => {\n const id = block.id ?? `${index}`;\n return (\n <TrackerBlockItem\n key={id}\n id={id}\n block={block}\n defaultBackgroundColor={defaultBackgroundColor}\n hoverEffect={hoverEffect}\n blockWidth={blockWidth}\n blockHeight={clampedBlockHeight}\n />\n );\n })}\n </div>\n );\n};\n\nexport default Tracker;\n"],"names":["DEFAULT_MIN_BLOCK_WIDTH","DEFAULT_MAX_BLOCK_WIDTH","DEFAULT_BLOCK_GAP","DEFAULT_BLOCK_HEIGHT","Tracker","props","data","defaultBackgroundColor","hoverEffect","minBlockWidth","maxBlockWidth","blockGap","blockHeight","collapseOnMinBlockWidth","collapseShowLastBlocks","className","trackerRef","_","inlineSize","useResizeObserver","clampedMinBlockWidth","clampedMaxBlockWidth","clampedBlockGap","clampedBlockHeight","visibleData","blockWidth","useMemo","containerWidth","maxVisibleWithMinWidth","visibleBlocksCount","widthPerBlock","wrapperClasses","classNames","block","index","id","jsx","TrackerBlockItem"],"mappings":";;;;;AAMA,MAAMA,IAA0B,GAC1BC,IAA0B,IAC1BC,IAAoB,GACpBC,IAAuB,IAmGvBC,IAAU,CAACC,MAAwB;AACrC,QAAM;AAAA,IACF,MAAAC;AAAA,IACA,wBAAAC,IAAyB;AAAA,IACzB,aAAAC,IAAc;AAAA,IACd,eAAAC,IAAgBT;AAAA,IAChB,eAAAU,IAAgBT;AAAA,IAChB,UAAAU,IAAWT;AAAA,IACX,aAAAU,IAAcT;AAAA,IACd,yBAAAU,IAA0B;AAAA,IAC1B,wBAAAC,IAAyB;AAAA,IACzB,WAAAC;AAAA,EAAA,IACAV,GACE,CAACW,GAAYC,GAAG,EAAE,YAAAC,EAAA,CAAY,IAAIC,EAAA,GAElCC,IAAuB,KAAK,IAAI,GAAGX,CAAa,GAChDY,IAAuB,KAAK,IAAID,GAAsBV,CAAa,GACnEY,IAAkB,KAAK,IAAI,GAAGX,CAAQ,GACtCY,IAAqB,KAAK,IAAI,GAAGX,CAAW,GAE5C,EAAE,aAAAY,GAAa,YAAAC,EAAA,IAAeC,EAAQ,MAAM;AAC9C,QAAIpB,EAAK,WAAW;AAChB,aAAO,EAAE,aAAaA,GAAM,YAAYe,EAAA;AAG5C,UAAMM,IAAiBT,KAAcZ,EAAK,SAASe,KAAwBf,EAAK,SAAS,KAAKgB,GACxFM,IAAyB,KAAK;AAAA,MAChC;AAAA,MACA,KAAK,OAAOD,IAAiBL,MAAoBF,IAAuBE,EAAgB;AAAA,IAAA,GAEtFO,IAAqBhB,IACrB,KAAK,IAAIP,EAAK,QAAQsB,CAAsB,IAC5CtB,EAAK,QACLkB,IAAcV,IACdR,EAAK,MAAM,CAACuB,CAAkB,IAC9BvB,EAAK,MAAM,GAAGuB,CAAkB,GAGhCC,IADiB,KAAK,IAAI,GAAGH,KAAkBH,EAAY,SAAS,KAAKF,CAAe,IACvDE,EAAY,QAC7CC,IAAa,KAAK,IAAIL,GAAsB,KAAK,IAAIC,GAAsBS,CAAa,CAAC;AAE/F,WAAO,EAAE,aAAAN,GAAa,YAAAC,EAAAA;AAAAA,EAC1B,GAAG;AAAA,IACCnB;AAAA,IACAY;AAAA,IACAE;AAAA,IACAC;AAAA,IACAC;AAAA,IACAT;AAAA,IACAC;AAAA,EAAA,CACH,GAEKiB,IAAiBC,EAAW,WAAWjB,CAAS;AAEtD,2BACK,OAAA,EAAI,KAAKC,GAAY,WAAWe,GAAgB,OAAO,EAAE,KAAK,GAAGT,CAAe,QAC5E,YAAY,IAAI,CAACW,GAAOC,MAAU;AAC/B,UAAMC,IAAKF,EAAM,MAAM,GAAGC,CAAK;AAC/B,WACI,gBAAAE;AAAA,MAACC;AAAAA,MAAA;AAAA,QAEG,IAAAF;AAAA,QACA,OAAAF;AAAA,QACA,wBAAA1B;AAAA,QACA,aAAAC;AAAA,QACA,YAAAiB;AAAA,QACA,aAAaF;AAAA,MAAA;AAAA,MANRY;AAAA,IAAA;AAAA,EASjB,CAAC,EAAA,CACL;AAER;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TrackerBlock as TrackerBlockData } from './Tracker';
|
|
2
|
+
type TrackerBlockProps = {
|
|
3
|
+
id: string;
|
|
4
|
+
block: TrackerBlockData;
|
|
5
|
+
defaultBackgroundColor: string;
|
|
6
|
+
hoverEffect: boolean;
|
|
7
|
+
blockWidth: number;
|
|
8
|
+
blockHeight: number;
|
|
9
|
+
};
|
|
10
|
+
declare const TrackerBlock: (props: TrackerBlockProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default TrackerBlock;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import d from "../../utils/classNames.js";
|
|
3
|
+
import m from "../tooltip/SimpleTooltip.js";
|
|
4
|
+
const u = (n) => {
|
|
5
|
+
const { id: e, block: o, defaultBackgroundColor: a, hoverEffect: s, blockWidth: i, blockHeight: k } = n, t = !!o.onClick, p = d(
|
|
6
|
+
"tracker-block",
|
|
7
|
+
o.color || a,
|
|
8
|
+
s && "tracker-block-hover",
|
|
9
|
+
t && "cursor-pointer",
|
|
10
|
+
o.className
|
|
11
|
+
), r = /* @__PURE__ */ c(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
className: p,
|
|
15
|
+
onClick: () => o.onClick?.(e),
|
|
16
|
+
onKeyDown: (l) => {
|
|
17
|
+
t && (l.key === "Enter" || l.key === " ") && (l.preventDefault(), o.onClick?.(e));
|
|
18
|
+
},
|
|
19
|
+
role: t ? "button" : void 0,
|
|
20
|
+
tabIndex: t ? 0 : void 0,
|
|
21
|
+
"aria-label": typeof o.tooltip == "string" ? o.tooltip : void 0,
|
|
22
|
+
style: {
|
|
23
|
+
width: `${i}px`,
|
|
24
|
+
minWidth: `${i}px`,
|
|
25
|
+
height: `${k}px`
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
return o.tooltip ? /* @__PURE__ */ c(m, { content: o.tooltip, allowOnTouch: !0, placement: "top", delay: { show: 100, hide: 50 }, children: r }) : r;
|
|
30
|
+
};
|
|
31
|
+
export {
|
|
32
|
+
u as default
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=TrackerBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackerBlock.js","sources":["../../../src/components/tracker/TrackerBlock.tsx"],"sourcesContent":["import classNames from '../../utils/classNames';\nimport SimpleTooltip from '../tooltip/SimpleTooltip';\nimport type { TrackerBlock as TrackerBlockData } from './Tracker';\n\ntype TrackerBlockProps = {\n id: string;\n block: TrackerBlockData;\n defaultBackgroundColor: string;\n hoverEffect: boolean;\n blockWidth: number;\n blockHeight: number;\n};\n\nconst TrackerBlock = (props: TrackerBlockProps) => {\n const { id, block, defaultBackgroundColor, hoverEffect, blockWidth, blockHeight } = props;\n\n const isClickable = Boolean(block.onClick);\n\n const blockClasses = classNames(\n 'tracker-block',\n block.color || defaultBackgroundColor,\n hoverEffect && 'tracker-block-hover',\n isClickable && 'cursor-pointer',\n block.className\n );\n\n const blockElement = (\n <div\n className={blockClasses}\n onClick={() => block.onClick?.(id)}\n onKeyDown={event => {\n if (!isClickable) {\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n block.onClick?.(id);\n }\n }}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n aria-label={typeof block.tooltip === 'string' ? block.tooltip : undefined}\n style={{\n width: `${blockWidth}px`,\n minWidth: `${blockWidth}px`,\n height: `${blockHeight}px`,\n }}\n />\n );\n\n if (!block.tooltip) {\n return blockElement;\n }\n\n return (\n <SimpleTooltip content={block.tooltip} allowOnTouch placement='top' delay={{ show: 100, hide: 50 }}>\n {blockElement}\n </SimpleTooltip>\n );\n};\n\nexport default TrackerBlock;\n"],"names":["TrackerBlock","props","id","block","defaultBackgroundColor","hoverEffect","blockWidth","blockHeight","isClickable","blockClasses","classNames","blockElement","jsx","event","SimpleTooltip"],"mappings":";;;AAaA,MAAMA,IAAe,CAACC,MAA6B;AAC/C,QAAM,EAAE,IAAAC,GAAI,OAAAC,GAAO,wBAAAC,GAAwB,aAAAC,GAAa,YAAAC,GAAY,aAAAC,MAAgBN,GAE9EO,IAAc,EAAQL,EAAM,SAE5BM,IAAeC;AAAA,IACjB;AAAA,IACAP,EAAM,SAASC;AAAA,IACfC,KAAe;AAAA,IACfG,KAAe;AAAA,IACfL,EAAM;AAAA,EAAA,GAGJQ,IACF,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWH;AAAA,MACX,SAAS,MAAMN,EAAM,UAAUD,CAAE;AAAA,MACjC,WAAW,CAAAW,MAAS;AAChB,QAAKL,MAIDK,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACvCA,EAAM,eAAA,GACNV,EAAM,UAAUD,CAAE;AAAA,MAE1B;AAAA,MACA,MAAMM,IAAc,WAAW;AAAA,MAC/B,UAAUA,IAAc,IAAI;AAAA,MAC5B,cAAY,OAAOL,EAAM,WAAY,WAAWA,EAAM,UAAU;AAAA,MAChE,OAAO;AAAA,QACH,OAAO,GAAGG,CAAU;AAAA,QACpB,UAAU,GAAGA,CAAU;AAAA,QACvB,QAAQ,GAAGC,CAAW;AAAA,MAAA;AAAA,IAC1B;AAAA,EAAA;AAIR,SAAKJ,EAAM,4BAKNW,GAAA,EAAc,SAASX,EAAM,SAAS,cAAY,IAAC,WAAU,OAAM,OAAO,EAAE,MAAM,KAAK,MAAM,MACzF,UAAAQ,GACL,IANOA;AAQf;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import _ from "
|
|
2
|
+
import _ from "../../utils/classNames.js";
|
|
3
3
|
const n = "4by3", l = "16by9", o = (r) => {
|
|
4
4
|
const { src: a, className: s = "", allowFullScreen: t = !0, aspectRatio: c = "16by9" } = r, i = _("video-responsive", `video-responsive-${c}`, s && s);
|
|
5
5
|
return /* @__PURE__ */ e("div", { className: i, children: /* @__PURE__ */ e("iframe", { src: a, allowFullScreen: t }) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponsiveVideo.js","sources":["../../../src/components/video/ResponsiveVideo.tsx"],"sourcesContent":["import classNames from '
|
|
1
|
+
{"version":3,"file":"ResponsiveVideo.js","sources":["../../../src/components/video/ResponsiveVideo.tsx"],"sourcesContent":["import classNames from '../../utils/classNames';\n\nconst FOUR_BY_THREE = '4by3';\nconst SIXTEEN_BY_NINE = '16by9';\n\nexport type AspectRatio = typeof FOUR_BY_THREE | typeof SIXTEEN_BY_NINE;\n\nexport type ResponsiveVideoProps = {\n /**\n * The link to the source of the video file.\n */\n src: string;\n\n /**\n * Defined the aspect ratio of the video.\n *\n * Possible values are:\n *\n * - `ResponsiveVideo.ASPECT_RATIO_4_BY_3`\n * - `ResponsiveVideo.ASPECT_RATIO_16_BY_9`\n * - `'4by3'`\n * - `'16by9'`\n *\n * @default '16by9'\n */\n aspectRatio: '4by3' | '16by9';\n\n /**\n * Allows the fullscreen feature of the underlying embedded iframe.\n *\n * @default true\n */\n allowFullScreen?: boolean;\n\n /**\n * Additional classes added to the wrapping element.\n */\n className?: string;\n};\n\nconst ResponsiveVideo = (props: ResponsiveVideoProps) => {\n const { src, className = '', allowFullScreen = true, aspectRatio = '16by9' } = props;\n\n const wrapperClassName = classNames('video-responsive', `video-responsive-${aspectRatio}`, className && className);\n\n return (\n <div className={wrapperClassName}>\n <iframe src={src} allowFullScreen={allowFullScreen} />\n </div>\n );\n};\n\nResponsiveVideo.ASPECT_RATIO_4_BY_3 = FOUR_BY_THREE as typeof FOUR_BY_THREE;\nResponsiveVideo.ASPECT_RATIO_16_BY_9 = SIXTEEN_BY_NINE as typeof SIXTEEN_BY_NINE;\n\nexport default ResponsiveVideo;\n"],"names":["FOUR_BY_THREE","SIXTEEN_BY_NINE","ResponsiveVideo","props","src","className","allowFullScreen","aspectRatio","wrapperClassName","classNames","jsx"],"mappings":";;AAEA,MAAMA,IAAgB,QAChBC,IAAkB,SAqClBC,IAAkB,CAACC,MAAgC;AACrD,QAAM,EAAE,KAAAC,GAAK,WAAAC,IAAY,IAAI,iBAAAC,IAAkB,IAAM,aAAAC,IAAc,YAAYJ,GAEzEK,IAAmBC,EAAW,oBAAoB,oBAAoBF,CAAW,IAAIF,KAAaA,CAAS;AAEjH,SACI,gBAAAK,EAAC,SAAI,WAAWF,GACZ,4BAAC,UAAA,EAAO,KAAAJ,GAAU,iBAAAE,GAAkC,EAAA,CACxD;AAER;AAEAJ,EAAgB,sBAAsBF;AACtCE,EAAgB,uBAAuBD;"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export type CookieSameSite = 'Strict' | 'Lax' | 'None';
|
|
2
|
+
export type CookieOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Cookie path scope.
|
|
5
|
+
*
|
|
6
|
+
* @default '/'
|
|
7
|
+
*/
|
|
8
|
+
path?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Cookie domain scope (for example `.rio.cloud`).
|
|
11
|
+
*/
|
|
12
|
+
domain?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Absolute expiration date for the cookie.
|
|
15
|
+
*/
|
|
16
|
+
expires?: Date | string;
|
|
17
|
+
/**
|
|
18
|
+
* Cookie lifetime in seconds.
|
|
19
|
+
*/
|
|
20
|
+
maxAge?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Cross-site cookie behavior.
|
|
23
|
+
*
|
|
24
|
+
* Possible values are:
|
|
25
|
+
*
|
|
26
|
+
* - `Strict`
|
|
27
|
+
* - `Lax`
|
|
28
|
+
* - `None`
|
|
29
|
+
*/
|
|
30
|
+
sameSite?: CookieSameSite;
|
|
31
|
+
/**
|
|
32
|
+
* Adds the `Secure` flag so the cookie is sent over HTTPS only.
|
|
33
|
+
*/
|
|
34
|
+
secure?: boolean;
|
|
35
|
+
};
|
|
36
|
+
export type UseCookiesResult = {
|
|
37
|
+
/**
|
|
38
|
+
* Sets a cookie with optional metadata.
|
|
39
|
+
*
|
|
40
|
+
* @param name - Cookie name.
|
|
41
|
+
* @param value - Cookie value.
|
|
42
|
+
* @param options - Additional cookie options.
|
|
43
|
+
*/
|
|
44
|
+
setCookie: (name: string, value: string, options?: CookieOptions) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Deletes a cookie by name.
|
|
47
|
+
*
|
|
48
|
+
* @param name - Cookie name.
|
|
49
|
+
* @param options - Optional path/domain to target the correct cookie scope.
|
|
50
|
+
*/
|
|
51
|
+
deleteCookie: (name: string, options?: Pick<CookieOptions, 'path' | 'domain'>) => void;
|
|
52
|
+
/**
|
|
53
|
+
* Returns true if the cookie exists.
|
|
54
|
+
*
|
|
55
|
+
* @param name - Cookie name.
|
|
56
|
+
*/
|
|
57
|
+
hasCookie: (name: string) => boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Reads a cookie value.
|
|
60
|
+
*
|
|
61
|
+
* @param name - Cookie name.
|
|
62
|
+
*/
|
|
63
|
+
getCookie: (name: string) => string | undefined;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Returns helpers to set, delete, and read browser cookies.
|
|
67
|
+
*
|
|
68
|
+
* @returns {UseCookiesResult} Cookie helper functions.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* const { setCookie, deleteCookie, hasCookie, getCookie } = useCookies();
|
|
72
|
+
*
|
|
73
|
+
* setCookie('token', 'abc123', { path: '/', maxAge: 60 * 60 });
|
|
74
|
+
* const isLoggedIn = hasCookie('token');
|
|
75
|
+
* const token = getCookie('token');
|
|
76
|
+
* deleteCookie('token');
|
|
77
|
+
*/
|
|
78
|
+
declare const useCookies: () => UseCookiesResult;
|
|
79
|
+
export default useCookies;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { useCallback as a } from "react";
|
|
2
|
+
const u = () => typeof document > "u" ? {} : document.cookie.split(";").map((n) => n.trim()).filter(Boolean).reduce(
|
|
3
|
+
(n, o) => {
|
|
4
|
+
const s = o.indexOf("="), i = s >= 0 ? o.slice(0, s) : o, t = s >= 0 ? o.slice(s + 1) : "";
|
|
5
|
+
return n[decodeURIComponent(i)] = decodeURIComponent(t), n;
|
|
6
|
+
},
|
|
7
|
+
{}
|
|
8
|
+
), f = () => {
|
|
9
|
+
const n = a((t, c, e = {}) => {
|
|
10
|
+
if (typeof document > "u")
|
|
11
|
+
return;
|
|
12
|
+
const r = [`${encodeURIComponent(t)}=${encodeURIComponent(c)}`, `path=${e.path ?? "/"}`];
|
|
13
|
+
if (e.domain && r.push(`domain=${e.domain}`), e.expires) {
|
|
14
|
+
const m = e.expires instanceof Date ? e.expires.toUTCString() : e.expires;
|
|
15
|
+
r.push(`expires=${m}`);
|
|
16
|
+
}
|
|
17
|
+
typeof e.maxAge == "number" && r.push(`max-age=${e.maxAge}`), e.sameSite && r.push(`samesite=${e.sameSite}`), e.secure && r.push("secure"), document.cookie = r.join("; ");
|
|
18
|
+
}, []), o = a(
|
|
19
|
+
(t, c = {}) => {
|
|
20
|
+
n(t, "", {
|
|
21
|
+
...c,
|
|
22
|
+
expires: /* @__PURE__ */ new Date(0),
|
|
23
|
+
maxAge: 0
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
[n]
|
|
27
|
+
), s = a((t) => Object.hasOwn(u(), t), []), i = a((t) => u()[t], []);
|
|
28
|
+
return { setCookie: n, deleteCookie: o, hasCookie: s, getCookie: i };
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
f as default
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=useCookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCookies.js","sources":["../../src/hooks/useCookies.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nexport type CookieSameSite = 'Strict' | 'Lax' | 'None';\n\nexport type CookieOptions = {\n /**\n * Cookie path scope.\n *\n * @default '/'\n */\n path?: string;\n\n /**\n * Cookie domain scope (for example `.rio.cloud`).\n */\n domain?: string;\n\n /**\n * Absolute expiration date for the cookie.\n */\n expires?: Date | string;\n\n /**\n * Cookie lifetime in seconds.\n */\n maxAge?: number;\n\n /**\n * Cross-site cookie behavior.\n *\n * Possible values are:\n *\n * - `Strict`\n * - `Lax`\n * - `None`\n */\n sameSite?: CookieSameSite;\n\n /**\n * Adds the `Secure` flag so the cookie is sent over HTTPS only.\n */\n secure?: boolean;\n};\n\nexport type UseCookiesResult = {\n /**\n * Sets a cookie with optional metadata.\n *\n * @param name - Cookie name.\n * @param value - Cookie value.\n * @param options - Additional cookie options.\n */\n setCookie: (name: string, value: string, options?: CookieOptions) => void;\n\n /**\n * Deletes a cookie by name.\n *\n * @param name - Cookie name.\n * @param options - Optional path/domain to target the correct cookie scope.\n */\n deleteCookie: (name: string, options?: Pick<CookieOptions, 'path' | 'domain'>) => void;\n\n /**\n * Returns true if the cookie exists.\n *\n * @param name - Cookie name.\n */\n hasCookie: (name: string) => boolean;\n\n /**\n * Reads a cookie value.\n *\n * @param name - Cookie name.\n */\n getCookie: (name: string) => string | undefined;\n};\n\nconst parseCookies = (): Record<string, string> => {\n if (typeof document === 'undefined') {\n return {};\n }\n\n return document.cookie\n .split(';')\n .map(entry => entry.trim())\n .filter(Boolean)\n .reduce(\n (acc, entry) => {\n const separatorIndex = entry.indexOf('=');\n const rawName = separatorIndex >= 0 ? entry.slice(0, separatorIndex) : entry;\n const rawValue = separatorIndex >= 0 ? entry.slice(separatorIndex + 1) : '';\n\n acc[decodeURIComponent(rawName)] = decodeURIComponent(rawValue);\n return acc;\n },\n {} as Record<string, string>\n );\n};\n\n/**\n * Returns helpers to set, delete, and read browser cookies.\n *\n * @returns {UseCookiesResult} Cookie helper functions.\n *\n * @example\n * const { setCookie, deleteCookie, hasCookie, getCookie } = useCookies();\n *\n * setCookie('token', 'abc123', { path: '/', maxAge: 60 * 60 });\n * const isLoggedIn = hasCookie('token');\n * const token = getCookie('token');\n * deleteCookie('token');\n */\nconst useCookies = (): UseCookiesResult => {\n const setCookie = useCallback((name: string, value: string, options: CookieOptions = {}) => {\n if (typeof document === 'undefined') {\n return;\n }\n\n const segments = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`, `path=${options.path ?? '/'}`];\n\n if (options.domain) {\n segments.push(`domain=${options.domain}`);\n }\n\n if (options.expires) {\n const expires = options.expires instanceof Date ? options.expires.toUTCString() : options.expires;\n segments.push(`expires=${expires}`);\n }\n\n if (typeof options.maxAge === 'number') {\n segments.push(`max-age=${options.maxAge}`);\n }\n\n if (options.sameSite) {\n segments.push(`samesite=${options.sameSite}`);\n }\n\n if (options.secure) {\n segments.push('secure');\n }\n\n // biome-ignore lint/suspicious/noDocumentCookie: this hook intentionally manages cookies through the browser cookie API.\n document.cookie = segments.join('; ');\n }, []);\n\n const deleteCookie = useCallback(\n (name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}) => {\n setCookie(name, '', {\n ...options,\n expires: new Date(0),\n maxAge: 0,\n });\n },\n [setCookie]\n );\n\n const hasCookie = useCallback((name: string) => {\n return Object.hasOwn(parseCookies(), name);\n }, []);\n\n const getCookie = useCallback((name: string) => {\n return parseCookies()[name];\n }, []);\n\n return { setCookie, deleteCookie, hasCookie, getCookie };\n};\n\nexport default useCookies;\n"],"names":["parseCookies","entry","acc","separatorIndex","rawName","rawValue","useCookies","setCookie","useCallback","name","value","options","segments","expires","deleteCookie","hasCookie","getCookie"],"mappings":";AA6EA,MAAMA,IAAe,MACb,OAAO,WAAa,MACb,CAAA,IAGJ,SAAS,OACX,MAAM,GAAG,EACT,IAAI,CAAAC,MAASA,EAAM,KAAA,CAAM,EACzB,OAAO,OAAO,EACd;AAAA,EACG,CAACC,GAAKD,MAAU;AACZ,UAAME,IAAiBF,EAAM,QAAQ,GAAG,GAClCG,IAAUD,KAAkB,IAAIF,EAAM,MAAM,GAAGE,CAAc,IAAIF,GACjEI,IAAWF,KAAkB,IAAIF,EAAM,MAAME,IAAiB,CAAC,IAAI;AAEzE,WAAAD,EAAI,mBAAmBE,CAAO,CAAC,IAAI,mBAAmBC,CAAQ,GACvDH;AAAA,EACX;AAAA,EACA,CAAA;AAAC,GAiBPI,IAAa,MAAwB;AACvC,QAAMC,IAAYC,EAAY,CAACC,GAAcC,GAAeC,IAAyB,OAAO;AACxF,QAAI,OAAO,WAAa;AACpB;AAGJ,UAAMC,IAAW,CAAC,GAAG,mBAAmBH,CAAI,CAAC,IAAI,mBAAmBC,CAAK,CAAC,IAAI,QAAQC,EAAQ,QAAQ,GAAG,EAAE;AAM3G,QAJIA,EAAQ,UACRC,EAAS,KAAK,UAAUD,EAAQ,MAAM,EAAE,GAGxCA,EAAQ,SAAS;AACjB,YAAME,IAAUF,EAAQ,mBAAmB,OAAOA,EAAQ,QAAQ,gBAAgBA,EAAQ;AAC1F,MAAAC,EAAS,KAAK,WAAWC,CAAO,EAAE;AAAA,IACtC;AAEA,IAAI,OAAOF,EAAQ,UAAW,YAC1BC,EAAS,KAAK,WAAWD,EAAQ,MAAM,EAAE,GAGzCA,EAAQ,YACRC,EAAS,KAAK,YAAYD,EAAQ,QAAQ,EAAE,GAG5CA,EAAQ,UACRC,EAAS,KAAK,QAAQ,GAI1B,SAAS,SAASA,EAAS,KAAK,IAAI;AAAA,EACxC,GAAG,CAAA,CAAE,GAECE,IAAeN;AAAA,IACjB,CAACC,GAAcE,IAAkD,OAAO;AACpE,MAAAJ,EAAUE,GAAM,IAAI;AAAA,QAChB,GAAGE;AAAA,QACH,SAAS,oBAAI,KAAK,CAAC;AAAA,QACnB,QAAQ;AAAA,MAAA,CACX;AAAA,IACL;AAAA,IACA,CAACJ,CAAS;AAAA,EAAA,GAGRQ,IAAYP,EAAY,CAACC,MACpB,OAAO,OAAOT,EAAA,GAAgBS,CAAI,GAC1C,CAAA,CAAE,GAECO,IAAYR,EAAY,CAACC,MACpBT,EAAA,EAAeS,CAAI,GAC3B,CAAA,CAAE;AAEL,SAAO,EAAE,WAAAF,GAAW,cAAAO,GAAc,WAAAC,GAAW,WAAAC,EAAA;AACjD;"}
|
package/hooks/useInterval.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { useRef as u, useEffect as
|
|
1
|
+
import { useRef as u, useEffect as s } from "react";
|
|
2
2
|
const f = (e, r) => {
|
|
3
3
|
const t = u(null), n = u(e);
|
|
4
|
-
return
|
|
4
|
+
return s(() => {
|
|
5
5
|
n.current = e;
|
|
6
|
-
}, [e]),
|
|
7
|
-
const
|
|
6
|
+
}, [e]), s(() => {
|
|
7
|
+
const o = () => n.current();
|
|
8
8
|
if (typeof r == "number")
|
|
9
|
-
return t.current =
|
|
9
|
+
return t.current = setInterval(o, r), () => clearInterval(t.current ?? void 0);
|
|
10
10
|
}, [r]), t;
|
|
11
11
|
};
|
|
12
12
|
export {
|
package/hooks/useInterval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInterval.js","sources":["../../src/hooks/useInterval.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n// See https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n\n/**\n * Custom hook to execute a callback function at specified intervals.\n *\n * @param callback - The callback function to be executed.\n * @param delay - The interval duration in milliseconds. Set to null to stop the interval.\n *\n * @returns A mutable ref object that holds the interval ID.\n */\nconst useInterval = (callback: () => void, delay: number | null): React.MutableRefObject<number | null> => {\n const intervalRef = useRef<number | null>(null);\n const savedCallback = useRef<() => void>(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n const tick = () => savedCallback.current();\n\n if (typeof delay === 'number') {\n intervalRef.current =
|
|
1
|
+
{"version":3,"file":"useInterval.js","sources":["../../src/hooks/useInterval.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n// See https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n\n/**\n * Custom hook to execute a callback function at specified intervals.\n *\n * @param callback - The callback function to be executed.\n * @param delay - The interval duration in milliseconds. Set to null to stop the interval.\n *\n * @returns A mutable ref object that holds the interval ID.\n */\nconst useInterval = (callback: () => void, delay: number | null): React.MutableRefObject<number | null> => {\n const intervalRef = useRef<number | null>(null);\n const savedCallback = useRef<() => void>(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n const tick = () => savedCallback.current();\n\n if (typeof delay === 'number') {\n intervalRef.current = setInterval(tick, delay) as unknown as number;\n return () => clearInterval(intervalRef.current ?? undefined);\n }\n }, [delay]);\n\n return intervalRef;\n};\n\nexport default useInterval;\n"],"names":["useInterval","callback","delay","intervalRef","useRef","savedCallback","useEffect","tick"],"mappings":";AAYA,MAAMA,IAAc,CAACC,GAAsBC,MAAgE;AACvG,QAAMC,IAAcC,EAAsB,IAAI,GACxCC,IAAgBD,EAAmBH,CAAQ;AAEjD,SAAAK,EAAU,MAAM;AACZ,IAAAD,EAAc,UAAUJ;AAAA,EAC5B,GAAG,CAACA,CAAQ,CAAC,GAEbK,EAAU,MAAM;AACZ,UAAMC,IAAO,MAAMF,EAAc,QAAA;AAEjC,QAAI,OAAOH,KAAU;AACjB,aAAAC,EAAY,UAAU,YAAYI,GAAML,CAAK,GACtC,MAAM,cAAcC,EAAY,WAAW,MAAS;AAAA,EAEnE,GAAG,CAACD,CAAK,CAAC,GAEHC;AACX;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useRef as a, useState as E, useEffect as I } from "react";
|
|
2
|
-
const
|
|
2
|
+
const L = ({
|
|
3
3
|
ref: d,
|
|
4
4
|
onFocusWithin: u = () => {
|
|
5
5
|
},
|
|
@@ -17,7 +17,7 @@ const F = ({
|
|
|
17
17
|
const f = () => {
|
|
18
18
|
s(), r || (i(!0), u());
|
|
19
19
|
}, l = (v) => {
|
|
20
|
-
s(), t.current =
|
|
20
|
+
s(), t.current = setTimeout(() => {
|
|
21
21
|
e.contains(v.relatedTarget) || (i(!1), o()), t.current = null;
|
|
22
22
|
}, c);
|
|
23
23
|
};
|
|
@@ -30,6 +30,6 @@ const F = ({
|
|
|
30
30
|
};
|
|
31
31
|
};
|
|
32
32
|
export {
|
|
33
|
-
|
|
33
|
+
L as default
|
|
34
34
|
};
|
|
35
35
|
//# sourceMappingURL=useIsFocusWithin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsFocusWithin.js","sources":["../../src/hooks/useIsFocusWithin.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\ntype UseIsFocusWithinOptions<T extends HTMLElement> = {\n /**\n * Optional external ref to the DOM element to track.\n * If not provided, the hook will return its own internal ref.\n */\n ref?: React.RefObject<T>;\n\n /**\n * Optional callback triggered when focus enters the element or its children.\n */\n onFocusWithin?: () => void;\n\n /**\n * Optional callback triggered when focus leaves the element and all its children.\n */\n onBlurWithin?: () => void;\n\n /**\n * Optional delay (in ms) before calling onBlurWithin.\n * Useful when focus might quickly shift between internal elements.\n * @default 0\n */\n delay?: number;\n};\n\n/**\n * React hook that tracks whether focus is currently within a given element or its children.\n * Provides a boolean state and a ref to attach to the tracked element.\n *\n * @param options Hook configuration including external ref, callbacks, and optional delay.\n * @returns An object containing the ref and whether focus is currently within the element.\n */\nconst useIsFocusWithin = <T extends HTMLElement>({\n ref: externalRef,\n onFocusWithin = () => {},\n onBlurWithin = () => {},\n delay = 0,\n}: UseIsFocusWithinOptions<T> = {}) => {\n const internalRef = useRef<T>(null);\n const targetRef = externalRef ?? internalRef;\n\n const [isFocusedWithin, setIsFocusedWithin] = useState(false);\n const timeoutId = useRef<number | null>(null);\n\n const clearTimeoutIfAny = () => {\n if (timeoutId.current !== null) {\n window.clearTimeout(timeoutId.current);\n timeoutId.current = null;\n }\n };\n\n useEffect(() => {\n const node = targetRef.current;\n if (!node) {\n return;\n }\n\n const handleFocusIn = () => {\n clearTimeoutIfAny();\n if (!isFocusedWithin) {\n setIsFocusedWithin(true);\n onFocusWithin();\n }\n };\n\n const handleFocusOut = (e: FocusEvent) => {\n clearTimeoutIfAny();\n timeoutId.current =
|
|
1
|
+
{"version":3,"file":"useIsFocusWithin.js","sources":["../../src/hooks/useIsFocusWithin.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\ntype UseIsFocusWithinOptions<T extends HTMLElement> = {\n /**\n * Optional external ref to the DOM element to track.\n * If not provided, the hook will return its own internal ref.\n */\n ref?: React.RefObject<T>;\n\n /**\n * Optional callback triggered when focus enters the element or its children.\n */\n onFocusWithin?: () => void;\n\n /**\n * Optional callback triggered when focus leaves the element and all its children.\n */\n onBlurWithin?: () => void;\n\n /**\n * Optional delay (in ms) before calling onBlurWithin.\n * Useful when focus might quickly shift between internal elements.\n * @default 0\n */\n delay?: number;\n};\n\n/**\n * React hook that tracks whether focus is currently within a given element or its children.\n * Provides a boolean state and a ref to attach to the tracked element.\n *\n * @param options Hook configuration including external ref, callbacks, and optional delay.\n * @returns An object containing the ref and whether focus is currently within the element.\n */\nconst useIsFocusWithin = <T extends HTMLElement>({\n ref: externalRef,\n onFocusWithin = () => {},\n onBlurWithin = () => {},\n delay = 0,\n}: UseIsFocusWithinOptions<T> = {}) => {\n const internalRef = useRef<T>(null);\n const targetRef = externalRef ?? internalRef;\n\n const [isFocusedWithin, setIsFocusedWithin] = useState(false);\n const timeoutId = useRef<number | null>(null);\n\n const clearTimeoutIfAny = () => {\n if (timeoutId.current !== null) {\n window.clearTimeout(timeoutId.current);\n timeoutId.current = null;\n }\n };\n\n useEffect(() => {\n const node = targetRef.current;\n if (!node) {\n return;\n }\n\n const handleFocusIn = () => {\n clearTimeoutIfAny();\n if (!isFocusedWithin) {\n setIsFocusedWithin(true);\n onFocusWithin();\n }\n };\n\n const handleFocusOut = (e: FocusEvent) => {\n clearTimeoutIfAny();\n timeoutId.current = setTimeout(() => {\n if (!node.contains(e.relatedTarget as Node)) {\n setIsFocusedWithin(false);\n onBlurWithin();\n }\n timeoutId.current = null;\n }, delay) as unknown as number;\n };\n\n node.addEventListener('focusin', handleFocusIn);\n node.addEventListener('focusout', handleFocusOut);\n\n return () => {\n node.removeEventListener('focusin', handleFocusIn);\n node.removeEventListener('focusout', handleFocusOut);\n clearTimeoutIfAny();\n };\n }, [targetRef, delay, onFocusWithin, onBlurWithin, isFocusedWithin]);\n\n return {\n ref: targetRef,\n isFocusedWithin,\n };\n};\n\nexport default useIsFocusWithin;\n"],"names":["useIsFocusWithin","externalRef","onFocusWithin","onBlurWithin","delay","internalRef","useRef","targetRef","isFocusedWithin","setIsFocusedWithin","useState","timeoutId","clearTimeoutIfAny","useEffect","node","handleFocusIn","handleFocusOut","e"],"mappings":";AAkCA,MAAMA,IAAmB,CAAwB;AAAA,EAC7C,KAAKC;AAAA,EACL,eAAAC,IAAgB,MAAM;AAAA,EAAC;AAAA,EACvB,cAAAC,IAAe,MAAM;AAAA,EAAC;AAAA,EACtB,OAAAC,IAAQ;AACZ,IAAgC,OAAO;AACnC,QAAMC,IAAcC,EAAU,IAAI,GAC5BC,IAAYN,KAAeI,GAE3B,CAACG,GAAiBC,CAAkB,IAAIC,EAAS,EAAK,GACtDC,IAAYL,EAAsB,IAAI,GAEtCM,IAAoB,MAAM;AAC5B,IAAID,EAAU,YAAY,SACtB,OAAO,aAAaA,EAAU,OAAO,GACrCA,EAAU,UAAU;AAAA,EAE5B;AAEA,SAAAE,EAAU,MAAM;AACZ,UAAMC,IAAOP,EAAU;AACvB,QAAI,CAACO;AACD;AAGJ,UAAMC,IAAgB,MAAM;AACxB,MAAAH,EAAA,GACKJ,MACDC,EAAmB,EAAI,GACvBP,EAAA;AAAA,IAER,GAEMc,IAAiB,CAACC,MAAkB;AACtC,MAAAL,EAAA,GACAD,EAAU,UAAU,WAAW,MAAM;AACjC,QAAKG,EAAK,SAASG,EAAE,aAAqB,MACtCR,EAAmB,EAAK,GACxBN,EAAA,IAEJQ,EAAU,UAAU;AAAA,MACxB,GAAGP,CAAK;AAAA,IACZ;AAEA,WAAAU,EAAK,iBAAiB,WAAWC,CAAa,GAC9CD,EAAK,iBAAiB,YAAYE,CAAc,GAEzC,MAAM;AACT,MAAAF,EAAK,oBAAoB,WAAWC,CAAa,GACjDD,EAAK,oBAAoB,YAAYE,CAAc,GACnDJ,EAAA;AAAA,IACJ;AAAA,EACJ,GAAG,CAACL,GAAWH,GAAOF,GAAeC,GAAcK,CAAe,CAAC,GAE5D;AAAA,IACH,KAAKD;AAAA,IACL,iBAAAC;AAAA,EAAA;AAER;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps a mutable ref in sync with the latest value from the current render.
|
|
3
|
+
*
|
|
4
|
+
* Useful when an effect or callback must always access the newest value
|
|
5
|
+
* without adding that value to a dependency array and re-triggering logic.
|
|
6
|
+
*
|
|
7
|
+
* Common use cases:
|
|
8
|
+
* - Access latest callback props inside long-lived effects/listeners
|
|
9
|
+
* - Avoid stale closures in timers, subscriptions, and event handlers
|
|
10
|
+
*
|
|
11
|
+
* @typeParam TValue - The value type to keep up to date.
|
|
12
|
+
* @param value - Current value from render scope.
|
|
13
|
+
* @returns A ref whose `.current` always points to the latest value.
|
|
14
|
+
*/
|
|
15
|
+
declare const useLatest: <TValue>(value: TValue) => React.MutableRefObject<TValue>;
|
|
16
|
+
export default useLatest;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLatest.js","sources":["../../src/hooks/useLatest.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * Keeps a mutable ref in sync with the latest value from the current render.\n *\n * Useful when an effect or callback must always access the newest value\n * without adding that value to a dependency array and re-triggering logic.\n *\n * Common use cases:\n * - Access latest callback props inside long-lived effects/listeners\n * - Avoid stale closures in timers, subscriptions, and event handlers\n *\n * @typeParam TValue - The value type to keep up to date.\n * @param value - Current value from render scope.\n * @returns A ref whose `.current` always points to the latest value.\n */\nconst useLatest = <TValue>(value: TValue): React.MutableRefObject<TValue> => {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n};\n\nexport default useLatest;\n"],"names":["useLatest","value","ref","useRef","useEffect"],"mappings":";AAgBA,MAAMA,IAAY,CAASC,MAAkD;AACzE,QAAMC,IAAMC,EAAOF,CAAK;AAExB,SAAAG,EAAU,MAAM;AACZ,IAAAF,EAAI,UAAUD;AAAA,EAClB,GAAG,CAACA,CAAK,CAAC,GAEHC;AACX;"}
|
|
@@ -23,7 +23,8 @@ export type RemoteAction = {
|
|
|
23
23
|
*
|
|
24
24
|
* @param messagePrefix a custom prefix to limit the event listener for these events
|
|
25
25
|
* @param onReceiveMessage a callback function triggered when a message is received
|
|
26
|
-
* @
|
|
26
|
+
* @deprecated Please use the {@link import('./useIncomingPostMessages')#default useIncomingPostMessages} and/or
|
|
27
|
+
* {@link import('./usePostMessageSender')#default usePostMessageSender} hooks instead.
|
|
27
28
|
*/
|
|
28
29
|
declare const usePostMessage: (messagePrefix: string, onReceiveMessage?: (eventData: any) => void) => {
|
|
29
30
|
sendMessageToParent: (message: RemoteAction) => void;
|