@cube-dev/ui-kit 0.113.1 → 0.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/CollectionItem.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +3 -4
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Banner/Banner.js +1 -1
- package/es/components/actions/Banner/index.js +1 -1
- package/es/components/actions/Button/Button.js +1 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemAction/ItemAction.js +5 -1
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemActionContext.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Link/Link.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +1 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Disclosure/Disclosure.js +1 -1
- package/es/components/content/Disclosure/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/Item/Item.js +1 -1
- package/es/components/content/Item/index.js +1 -1
- package/es/components/content/ItemBadge/ItemBadge.js +1 -1
- package/es/components/content/ItemBadge/index.js +1 -1
- package/es/components/content/Layout/GridLayout.js +1 -1
- package/es/components/content/Layout/Layout.js +1 -1
- package/es/components/content/Layout/LayoutBlock.js +1 -1
- package/es/components/content/Layout/LayoutCenter.js +1 -1
- package/es/components/content/Layout/LayoutContainer.js +1 -1
- package/es/components/content/Layout/LayoutContent.js +1 -1
- package/es/components/content/Layout/LayoutContext.js +1 -1
- package/es/components/content/Layout/LayoutFlex.js +1 -1
- package/es/components/content/Layout/LayoutFooter.js +1 -1
- package/es/components/content/Layout/LayoutGrid.js +1 -1
- package/es/components/content/Layout/LayoutHeader.js +1 -1
- package/es/components/content/Layout/LayoutPane.js +1 -1
- package/es/components/content/Layout/LayoutPanel.js +1 -1
- package/es/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/es/components/content/Layout/LayoutToolbar.js +1 -1
- package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/es/components/content/Layout/index.js +1 -1
- package/es/components/content/Layout/utils.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +1 -1
- package/es/components/content/TextItem/TextItem.js +1 -1
- package/es/components/content/TextItem/index.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/content/highlightText.js +1 -1
- package/es/components/content/use-auto-tooltip.js +1 -1
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +1 -1
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/Picker/Picker.js +1 -1
- package/es/components/fields/Picker/index.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/HueSlider.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +1 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/es/components/helpers/DisplayTransition/index.js +1 -1
- package/es/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/es/components/helpers/index.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/es/components/navigation/Tabs/EditableTitle.js +1 -1
- package/es/components/navigation/Tabs/TabButton.js +1 -1
- package/es/components/navigation/Tabs/TabDropIndicator.js +28 -2
- package/es/components/navigation/Tabs/TabPanel.js +1 -1
- package/es/components/navigation/Tabs/TabPicker.js +1 -1
- package/es/components/navigation/Tabs/Tabs.js +1 -1
- package/es/components/navigation/Tabs/TabsAction.js +1 -1
- package/es/components/navigation/Tabs/TabsContext.js +1 -1
- package/es/components/navigation/Tabs/index.js +1 -1
- package/es/components/navigation/Tabs/styled.js +1 -1
- package/es/components/navigation/Tabs/types.js +1 -1
- package/es/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/es/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/es/components/navigation/index.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +1 -1
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +1 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/Notifications/Notification.js +89 -0
- package/es/components/overlays/Notifications/NotificationAction.js +82 -0
- package/es/components/overlays/Notifications/NotificationCard.js +87 -0
- package/es/components/overlays/Notifications/NotificationContext.js +44 -0
- package/es/components/overlays/Notifications/NotificationItem.js +63 -0
- package/es/components/overlays/Notifications/OverlayContainer.js +346 -0
- package/es/components/overlays/Notifications/OverlayProvider.js +69 -0
- package/es/components/overlays/Notifications/PersistentNotificationsList.js +120 -0
- package/es/components/overlays/Notifications/format-relative-time.js +55 -0
- package/es/components/overlays/Notifications/index.js +51 -0
- package/es/components/overlays/{NewNotifications/NotificationsList → Notifications}/types.js +1 -1
- package/es/components/overlays/Notifications/use-notification-state.js +239 -0
- package/es/components/overlays/Notifications/use-notifications.js +175 -0
- package/es/components/overlays/Notifications/use-overlay-timers.js +141 -0
- package/es/components/overlays/Notifications/use-persistent-notifications.js +63 -0
- package/es/components/overlays/Notifications/use-persistent-state.js +85 -0
- package/es/components/overlays/Notifications/use-toast-state.js +143 -0
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toast/ToastItem.js +6 -3
- package/es/components/overlays/Toast/ToastProvider.js +6 -352
- package/es/components/overlays/Toast/index.js +3 -8
- package/es/components/overlays/Toast/types.js +1 -1
- package/es/components/overlays/Toast/useProgressToast.js +2 -5
- package/es/components/overlays/Toast/useToast.js +1 -7
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartHeatmapIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/ColumnTotalIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/CubePauseIcon.js +1 -1
- package/es/icons/CubePlayIcon.js +1 -1
- package/es/icons/CurrencyDollarIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DecimalDecreaseIcon.js +1 -1
- package/es/icons/DecimalIncreaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/HierarchyOpenIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/Number123Icon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PercentageIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ProgressBarIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/RowTotalsIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SemanticQueryIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SubtotalsIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/TrashIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +2 -4
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/SimpleLayout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/stories/playground/PlaygroundEditor.js +1 -1
- package/es/stories/playground/PlaygroundLayout.js +1 -1
- package/es/stories/playground/PlaygroundOutput.js +1 -1
- package/es/stories/playground/PlaygroundPreview.js +1 -1
- package/es/stories/playground/components/Button.js +1 -1
- package/es/stories/playground/components/Card.js +1 -1
- package/es/stories/playground/components/ScrollProgress.js +1 -1
- package/es/stories/playground/examples.js +1 -1
- package/es/tasty/chunks/cacheKey.js +1 -1
- package/es/tasty/chunks/definitions.js +1 -1
- package/es/tasty/chunks/index.js +1 -1
- package/es/tasty/chunks/renderChunk.js +1 -1
- package/es/tasty/config.js +1 -1
- package/es/tasty/debug.js +1 -1
- package/es/tasty/hooks/index.js +1 -1
- package/es/tasty/hooks/useGlobalStyles.js +1 -1
- package/es/tasty/hooks/useKeyframes.js +1 -1
- package/es/tasty/hooks/useProperty.js +1 -1
- package/es/tasty/hooks/useRawCSS.js +1 -1
- package/es/tasty/hooks/useStyles.js +1 -1
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +1 -1
- package/es/tasty/injector/injector.js +1 -1
- package/es/tasty/injector/sheet-manager.js +1 -1
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/keyframes/index.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/pipeline/conditions.js +1 -1
- package/es/tasty/pipeline/exclusive.js +1 -1
- package/es/tasty/pipeline/index.js +1 -1
- package/es/tasty/pipeline/materialize.js +1 -1
- package/es/tasty/pipeline/parseStateKey.js +1 -1
- package/es/tasty/pipeline/simplify.js +1 -1
- package/es/tasty/plugins/index.js +1 -1
- package/es/tasty/plugins/okhsl-plugin.js +1 -1
- package/es/tasty/plugins/types.js +1 -1
- package/es/tasty/properties/index.js +1 -1
- package/es/tasty/states/index.js +1 -1
- package/es/tasty/static/index.js +1 -1
- package/es/tasty/static/tastyStatic.js +1 -1
- package/es/tasty/static/types.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +1 -1
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filter-base-props.js +1 -1
- package/es/tasty/utils/get-display-name.js +1 -1
- package/es/tasty/utils/hsl-to-rgb.js +1 -1
- package/es/tasty/utils/is-dev-env.js +1 -1
- package/es/tasty/utils/merge-styles.js +1 -1
- package/es/tasty/utils/mod-attrs.js +1 -1
- package/es/tasty/utils/okhsl-to-rgb.js +1 -1
- package/es/tasty/utils/process-tokens.js +1 -1
- package/es/tasty/utils/resolve-recipes.js +1 -1
- package/es/tasty/utils/rgb-to-okhsl.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +1 -1
- package/es/tasty/utils/typography.js +1 -1
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tasty/zero/babel.js +1 -1
- package/es/tasty/zero/css-writer.js +1 -1
- package/es/tasty/zero/extractor.js +1 -1
- package/es/tasty/zero/index.js +1 -1
- package/es/tasty/zero/next.js +1 -1
- package/es/tokens/base.js +1 -1
- package/es/tokens/colors.js +1 -1
- package/es/tokens/index.js +1 -1
- package/es/tokens/layout.js +1 -1
- package/es/tokens/shadows.js +1 -1
- package/es/tokens/sizes.js +1 -1
- package/es/tokens/spacing.js +1 -1
- package/es/tokens/typography.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/index.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/raf.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/RenderCache.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/resolveIcon.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useLocalStorage.js +1 -1
- package/es/utils/react/useMergeStyles.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/overlays/Notifications/Notification.d.ts +32 -0
- package/types/components/overlays/Notifications/NotificationAction.d.ts +27 -0
- package/types/components/overlays/Notifications/NotificationCard.d.ts +37 -0
- package/types/components/overlays/Notifications/NotificationContext.d.ts +16 -0
- package/types/components/overlays/Notifications/NotificationItem.d.ts +7 -0
- package/types/components/overlays/Notifications/OverlayContainer.d.ts +12 -0
- package/types/components/overlays/Notifications/OverlayProvider.d.ts +3 -0
- package/types/components/overlays/Notifications/PersistentNotificationsList.d.ts +19 -0
- package/types/components/overlays/Notifications/format-relative-time.d.ts +14 -0
- package/types/components/overlays/Notifications/index.d.ts +40 -0
- package/types/components/overlays/Notifications/types.d.ts +154 -0
- package/types/components/overlays/Notifications/use-notification-state.d.ts +23 -0
- package/types/components/overlays/Notifications/use-notifications.d.ts +36 -0
- package/types/components/overlays/Notifications/use-overlay-timers.d.ts +26 -0
- package/types/components/overlays/Notifications/use-persistent-notifications.d.ts +48 -0
- package/types/components/overlays/Notifications/use-persistent-state.d.ts +23 -0
- package/types/components/overlays/Notifications/use-toast-state.d.ts +16 -0
- package/types/components/overlays/Toast/ToastItem.d.ts +3 -1
- package/types/components/overlays/Toast/ToastProvider.d.ts +5 -8
- package/types/components/overlays/Toast/index.d.ts +1 -1
- package/types/components/overlays/Toast/types.d.ts +3 -1
- package/types/index.d.ts +1 -3
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +0 -54
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +0 -95
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +0 -56
- package/es/components/overlays/NewNotifications/Bar/index.js +0 -10
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +0 -19
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +0 -38
- package/es/components/overlays/NewNotifications/Dialog/index.js +0 -10
- package/es/components/overlays/NewNotifications/Notification.js +0 -41
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +0 -41
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +0 -25
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +0 -36
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +0 -60
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +0 -31
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +0 -69
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +0 -25
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +0 -86
- package/es/components/overlays/NewNotifications/NotificationView/index.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationView/types.js +0 -10
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +0 -21
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +0 -91
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +0 -45
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +0 -29
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +0 -10
- package/es/components/overlays/NewNotifications/hooks/index.js +0 -14
- package/es/components/overlays/NewNotifications/hooks/types.js +0 -10
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +0 -15
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +0 -17
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +0 -29
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +0 -17
- package/es/components/overlays/NewNotifications/index.js +0 -15
- package/es/components/overlays/NewNotifications/types.js +0 -10
- package/es/components/overlays/Notification/Notification.js +0 -80
- package/es/services/notification.js +0 -71
- package/types/components/overlays/NewNotifications/Bar/FloatingNotification.d.ts +0 -15
- package/types/components/overlays/NewNotifications/Bar/NotificationsBar.d.ts +0 -21
- package/types/components/overlays/NewNotifications/Bar/TransitionComponent.d.ts +0 -4
- package/types/components/overlays/NewNotifications/Bar/index.d.ts +0 -1
- package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.d.ts +0 -9
- package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.d.ts +0 -11
- package/types/components/overlays/NewNotifications/Dialog/index.d.ts +0 -1
- package/types/components/overlays/NewNotifications/Notification.d.ts +0 -18
- package/types/components/overlays/NewNotifications/NotificationView/NotificationAction.d.ts +0 -13
- package/types/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.d.ts +0 -4
- package/types/components/overlays/NewNotifications/NotificationView/NotificationDescription.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationFooter.d.ts +0 -13
- package/types/components/overlays/NewNotifications/NotificationView/NotificationHeader.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationIcon.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationProvider.d.ts +0 -10
- package/types/components/overlays/NewNotifications/NotificationView/NotificationView.d.ts +0 -10
- package/types/components/overlays/NewNotifications/NotificationView/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationView/types.d.ts +0 -16
- package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.d.ts +0 -5
- package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.d.ts +0 -4
- package/types/components/overlays/NewNotifications/NotificationsContext/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationsContext/use-notifications.d.ts +0 -8
- package/types/components/overlays/NewNotifications/NotificationsList/NotificationsList.d.ts +0 -21
- package/types/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.d.ts +0 -5
- package/types/components/overlays/NewNotifications/NotificationsList/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationsList/types.d.ts +0 -22
- package/types/components/overlays/NewNotifications/hooks/index.d.ts +0 -5
- package/types/components/overlays/NewNotifications/hooks/types.d.ts +0 -10
- package/types/components/overlays/NewNotifications/hooks/use-notification-list-item.d.ts +0 -9
- package/types/components/overlays/NewNotifications/hooks/use-notifications-api.d.ts +0 -1
- package/types/components/overlays/NewNotifications/hooks/use-notifications-list.d.ts +0 -12
- package/types/components/overlays/NewNotifications/hooks/use-notifications-observer.d.ts +0 -2
- package/types/components/overlays/NewNotifications/index.d.ts +0 -8
- package/types/components/overlays/NewNotifications/types.d.ts +0 -76
- package/types/components/overlays/Notification/Notification.d.ts +0 -6
- package/types/services/notification.d.ts +0 -28
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.114.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useRef, useState } from 'react';
|
|
9
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
10
|
+
// ─── Hook ────────────────────────────────────────────────────────────
|
|
11
|
+
export function usePersistentState(maxItems) {
|
|
12
|
+
const [persistentItems, setPersistentItems] = useState([]);
|
|
13
|
+
// Tracks IDs that have been moved to the persistent list at least once.
|
|
14
|
+
// Used to skip the overlay when the same id reappears.
|
|
15
|
+
const dismissedPersistentIdsRef = useRef(new Set());
|
|
16
|
+
// Tracks IDs that were explicitly removed from the persistent list by the
|
|
17
|
+
// user. These should be completely ignored on subsequent triggers.
|
|
18
|
+
const fullyDismissedIdsRef = useRef(new Set());
|
|
19
|
+
const addPersistentItem = useEvent((item) => {
|
|
20
|
+
// If the user already dismissed this item from the persistent list, don't re-add it.
|
|
21
|
+
if (fullyDismissedIdsRef.current.has(item.id))
|
|
22
|
+
return;
|
|
23
|
+
dismissedPersistentIdsRef.current.add(item.id);
|
|
24
|
+
setPersistentItems((prev) => {
|
|
25
|
+
// Upsert by id
|
|
26
|
+
const existingIndex = prev.findIndex((i) => i.id === item.id);
|
|
27
|
+
let newItems;
|
|
28
|
+
if (existingIndex !== -1) {
|
|
29
|
+
newItems = [...prev];
|
|
30
|
+
// Updated items are marked unread again
|
|
31
|
+
newItems[existingIndex] = {
|
|
32
|
+
...newItems[existingIndex],
|
|
33
|
+
...item,
|
|
34
|
+
isRead: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
newItems = [{ ...item, isRead: item.isRead ?? false }, ...prev];
|
|
39
|
+
}
|
|
40
|
+
// Enforce max cap
|
|
41
|
+
if (newItems.length > maxItems) {
|
|
42
|
+
newItems = newItems.slice(0, maxItems);
|
|
43
|
+
}
|
|
44
|
+
// Sort newest first
|
|
45
|
+
newItems.sort((a, b) => b.createdAt - a.createdAt);
|
|
46
|
+
return newItems;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
const removePersistentItem = useEvent((id) => {
|
|
50
|
+
fullyDismissedIdsRef.current.add(id);
|
|
51
|
+
setPersistentItems((prev) => prev.filter((i) => i.id !== id));
|
|
52
|
+
});
|
|
53
|
+
const removePersistentItemsByOwner = useEvent((ownerId) => {
|
|
54
|
+
setPersistentItems((prev) => prev.filter((i) => i.ownerId !== ownerId));
|
|
55
|
+
});
|
|
56
|
+
const clearPersistentItems = useEvent(() => {
|
|
57
|
+
setPersistentItems([]);
|
|
58
|
+
});
|
|
59
|
+
const markAllAsRead = useEvent(() => {
|
|
60
|
+
setPersistentItems((prev) => {
|
|
61
|
+
const hasUnread = prev.some((i) => !i.isRead);
|
|
62
|
+
if (!hasUnread)
|
|
63
|
+
return prev;
|
|
64
|
+
return prev.map((i) => (i.isRead ? i : { ...i, isRead: true }));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
const hasDismissedPersistentId = useEvent((id) => {
|
|
68
|
+
return dismissedPersistentIdsRef.current.has(id);
|
|
69
|
+
});
|
|
70
|
+
const isFullyDismissedId = useEvent((id) => {
|
|
71
|
+
return fullyDismissedIdsRef.current.has(id);
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
persistentItems,
|
|
75
|
+
addPersistentItem,
|
|
76
|
+
removePersistentItem,
|
|
77
|
+
removePersistentItemsByOwner,
|
|
78
|
+
clearPersistentItems,
|
|
79
|
+
markAllAsRead,
|
|
80
|
+
hasDismissedPersistentId,
|
|
81
|
+
isFullyDismissedId,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.114.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useRef, useState } from 'react';
|
|
9
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
10
|
+
// ─── Constants ───────────────────────────────────────────────────────
|
|
11
|
+
const DEFAULT_TOAST_DURATION = 5000;
|
|
12
|
+
const MAX_TOASTS = 3;
|
|
13
|
+
// ─── Dedupe Key ──────────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Generate a deduplication key for a toast.
|
|
16
|
+
* Uses JSON.stringify with alphabetically ordered keys to prevent false
|
|
17
|
+
* collisions when title/description contains separator characters.
|
|
18
|
+
*/
|
|
19
|
+
function generateToastDedupeKey(data) {
|
|
20
|
+
if (data.id != null)
|
|
21
|
+
return String(data.id);
|
|
22
|
+
return JSON.stringify({
|
|
23
|
+
description: typeof data.description === 'string' ? data.description : '',
|
|
24
|
+
theme: data.theme ?? 'default',
|
|
25
|
+
title: typeof data.title === 'string' ? data.title : '',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
29
|
+
function matchesToastId(item, id) {
|
|
30
|
+
return item.id === id || item.internalId === String(id);
|
|
31
|
+
}
|
|
32
|
+
function findToast(list, id) {
|
|
33
|
+
return list.find((t) => matchesToastId(t, id));
|
|
34
|
+
}
|
|
35
|
+
// ─── Hook ────────────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* @param timersRef - Ref to the shared OverlayTimers instance. Accessed only
|
|
38
|
+
* inside callbacks (never during render), so it is guaranteed to be populated.
|
|
39
|
+
*/
|
|
40
|
+
export function useToastState(timersRef) {
|
|
41
|
+
const [toasts, setToasts] = useState([]);
|
|
42
|
+
const toastsRef = useRef(toasts);
|
|
43
|
+
toastsRef.current = toasts;
|
|
44
|
+
const idCounter = useRef(0);
|
|
45
|
+
const removeToast = useEvent((id) => {
|
|
46
|
+
// Perform side effects outside the updater (StrictMode-safe).
|
|
47
|
+
const toast = findToast(toastsRef.current, id);
|
|
48
|
+
if (toast) {
|
|
49
|
+
timersRef.current?.clearToastTimer(toast.internalId);
|
|
50
|
+
}
|
|
51
|
+
setToasts((prev) => prev.map((t) => (matchesToastId(t, id) ? { ...t, isExiting: true } : t)));
|
|
52
|
+
});
|
|
53
|
+
const finalizeToastRemoval = useEvent((internalId) => {
|
|
54
|
+
setToasts((prev) => prev.filter((t) => t.internalId !== internalId));
|
|
55
|
+
});
|
|
56
|
+
const addToast = useEvent((data, isProgress = false) => {
|
|
57
|
+
idCounter.current += 1;
|
|
58
|
+
const internalId = `toast-${idCounter.current}-${Date.now()}`;
|
|
59
|
+
const dedupeKey = generateToastDedupeKey(data);
|
|
60
|
+
const duration = isProgress
|
|
61
|
+
? null
|
|
62
|
+
: data.duration ?? DEFAULT_TOAST_DURATION;
|
|
63
|
+
const newToast = {
|
|
64
|
+
...data,
|
|
65
|
+
internalId,
|
|
66
|
+
isProgress,
|
|
67
|
+
dedupeKey,
|
|
68
|
+
createdAt: Date.now(),
|
|
69
|
+
};
|
|
70
|
+
// Perform dedupe side effects outside the updater (StrictMode-safe).
|
|
71
|
+
const existingToast = toastsRef.current.find((t) => t.dedupeKey === dedupeKey && !t.isExiting);
|
|
72
|
+
if (existingToast) {
|
|
73
|
+
timersRef.current?.clearToastTimer(existingToast.internalId);
|
|
74
|
+
}
|
|
75
|
+
// Single setState call: mark duplicate as exiting, append new toast,
|
|
76
|
+
// and evict oldest temporal toasts if we exceed MAX_TOASTS.
|
|
77
|
+
// Track evicted IDs so we can clear timers outside the updater (StrictMode-safe).
|
|
78
|
+
let wasEvicted = false;
|
|
79
|
+
const evictedIds = [];
|
|
80
|
+
setToasts((prev) => {
|
|
81
|
+
let newToasts = prev;
|
|
82
|
+
// Mark existing toast with same dedupe key as exiting
|
|
83
|
+
if (existingToast) {
|
|
84
|
+
newToasts = newToasts.map((t) => t.internalId === existingToast.internalId
|
|
85
|
+
? { ...t, isExiting: true }
|
|
86
|
+
: t);
|
|
87
|
+
}
|
|
88
|
+
// Append the new toast
|
|
89
|
+
newToasts = [...newToasts, newToast];
|
|
90
|
+
// Evict oldest temporal toasts if over the cap
|
|
91
|
+
const activeToasts = newToasts.filter((t) => !t.isExiting);
|
|
92
|
+
const progressToasts = activeToasts.filter((t) => t.isProgress);
|
|
93
|
+
const temporalToasts = activeToasts.filter((t) => !t.isProgress);
|
|
94
|
+
while (activeToasts.length > MAX_TOASTS) {
|
|
95
|
+
if (temporalToasts.length > 1 || progressToasts.length < MAX_TOASTS) {
|
|
96
|
+
const oldestTemporal = temporalToasts.shift();
|
|
97
|
+
if (oldestTemporal) {
|
|
98
|
+
evictedIds.push(oldestTemporal.internalId);
|
|
99
|
+
newToasts = newToasts.map((t) => t.internalId === oldestTemporal.internalId
|
|
100
|
+
? { ...t, isExiting: true }
|
|
101
|
+
: t);
|
|
102
|
+
const idx = activeToasts.findIndex((t) => t.internalId === oldestTemporal.internalId);
|
|
103
|
+
if (idx !== -1)
|
|
104
|
+
activeToasts.splice(idx, 1);
|
|
105
|
+
// Check if the newly added toast was evicted
|
|
106
|
+
if (oldestTemporal.internalId === internalId) {
|
|
107
|
+
wasEvicted = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return newToasts;
|
|
119
|
+
});
|
|
120
|
+
// Clear timers for evicted toasts outside the updater (StrictMode-safe)
|
|
121
|
+
for (const evictedId of evictedIds) {
|
|
122
|
+
timersRef.current?.clearToastTimer(evictedId);
|
|
123
|
+
}
|
|
124
|
+
// Start timer only if the toast wasn't immediately evicted
|
|
125
|
+
if (!wasEvicted && duration != null && duration > 0) {
|
|
126
|
+
timersRef.current?.startToastTimer(internalId, data.id ?? internalId, duration);
|
|
127
|
+
}
|
|
128
|
+
return data.id ?? internalId;
|
|
129
|
+
});
|
|
130
|
+
const updateToast = useEvent((id, data) => {
|
|
131
|
+
setToasts((prev) => prev.map((t) => (matchesToastId(t, id) ? { ...t, ...data } : t)));
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
toasts,
|
|
135
|
+
toastsRef,
|
|
136
|
+
addToast,
|
|
137
|
+
removeToast,
|
|
138
|
+
updateToast,
|
|
139
|
+
finalizeToastRemoval,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.114.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -9,8 +9,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
9
9
|
import { forwardRef } from 'react';
|
|
10
10
|
import { tasty } from '../../../tasty/index.js';
|
|
11
11
|
import { Item } from '../../content/Item/Item.js';
|
|
12
|
+
import { getThemeIcon } from './useToast.js';
|
|
12
13
|
const StyledItem = tasty(Item, {
|
|
13
14
|
styles: {
|
|
15
|
+
shadow: '$card-shadow',
|
|
14
16
|
transition: 'theme, inset',
|
|
15
17
|
pointerEvents: 'none',
|
|
16
18
|
Description: {
|
|
@@ -19,11 +21,12 @@ const StyledItem = tasty(Item, {
|
|
|
19
21
|
},
|
|
20
22
|
});
|
|
21
23
|
export const ToastItem = forwardRef(function ToastItem(props, ref) {
|
|
22
|
-
const { title, description, theme, isLoading, children, qa, ...itemProps } = props;
|
|
24
|
+
const { title, description, theme, isLoading, icon: providedIcon, children, qa, ...itemProps } = props;
|
|
25
|
+
const icon = getThemeIcon(theme, providedIcon, isLoading);
|
|
23
26
|
// If only description provided (no title/children), use description as primary content
|
|
24
27
|
const primaryContent = children ?? title ?? description;
|
|
25
28
|
const secondaryContent = children || title ? description : undefined;
|
|
26
|
-
return (_jsx(StyledItem, { ref: ref, qa: qa ?? 'Toast', type: "card", theme: theme, isLoading: isLoading, description: secondaryContent, ...itemProps, children: primaryContent }));
|
|
29
|
+
return (_jsx(StyledItem, { ref: ref, qa: qa ?? 'Toast', type: "card", theme: theme, icon: icon, isLoading: isLoading, description: secondaryContent, ...itemProps, children: primaryContent }));
|
|
27
30
|
});
|
|
28
31
|
|
|
29
32
|
|
|
@@ -1,360 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.114.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import { Portal } from '../../portal/index.js';
|
|
14
|
-
import { ToastItem } from './ToastItem.js';
|
|
15
|
-
const DEFAULT_DURATION = 5000;
|
|
16
|
-
const MAX_TOASTS = 3;
|
|
17
|
-
const COLLAPSE_VISIBLE_HEIGHT = 10;
|
|
18
|
-
const CONTAINER_OFFSET = 16; // Container's top offset from viewport (2x)
|
|
19
|
-
// Generate deduplication key from toast data
|
|
20
|
-
function generateDedupeKey(data) {
|
|
21
|
-
const id = data.id;
|
|
22
|
-
if (id != null) {
|
|
23
|
-
return String(id);
|
|
24
|
-
}
|
|
25
|
-
// Hash based on title + description + theme
|
|
26
|
-
const parts = [
|
|
27
|
-
typeof data.title === 'string' ? data.title : '',
|
|
28
|
-
typeof data.description === 'string' ? data.description : '',
|
|
29
|
-
data.theme ?? 'default',
|
|
30
|
-
];
|
|
31
|
-
return parts.join('|');
|
|
32
|
-
}
|
|
33
|
-
const ToastContext = createContext(null);
|
|
34
|
-
export function useToastContext() {
|
|
35
|
-
const context = useContext(ToastContext);
|
|
36
|
-
if (!context) {
|
|
37
|
-
throw new Error('useToastContext must be used within a ToastProvider');
|
|
38
|
-
}
|
|
39
|
-
return context;
|
|
40
|
-
}
|
|
41
|
-
const TOAST_GAP = 8; // Gap between toasts in pixels
|
|
42
|
-
const ToastContainerElement = tasty({
|
|
43
|
-
styles: {
|
|
44
|
-
position: 'fixed',
|
|
45
|
-
top: '2x',
|
|
46
|
-
left: '50%',
|
|
47
|
-
transform: 'translateX(-50%)',
|
|
48
|
-
zIndex: 10000,
|
|
49
|
-
padding: '1x',
|
|
50
|
-
height: '0',
|
|
51
|
-
pointerEvents: 'none',
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
const ToastWrapper = tasty({
|
|
55
|
-
styles: {
|
|
56
|
-
position: 'absolute',
|
|
57
|
-
top: '0',
|
|
58
|
-
left: '50%',
|
|
59
|
-
transform: 'translateX(-50%)',
|
|
60
|
-
width: 'max-content 50x',
|
|
61
|
-
pointerEvents: 'auto',
|
|
62
|
-
transition: 'top 0.3s, opacity 0.3s',
|
|
63
|
-
opacity: {
|
|
64
|
-
'': 0,
|
|
65
|
-
isShown: 1,
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
// Default height used for initial positioning before measurement
|
|
70
|
-
const DEFAULT_TOAST_HEIGHT = 56;
|
|
71
|
-
function ToastContainer({ toasts, onExitComplete }) {
|
|
72
|
-
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
73
|
-
const [heights, setHeights] = useState({});
|
|
74
|
-
const containerRef = useRef(null);
|
|
75
|
-
const boundsRef = useRef(null);
|
|
76
|
-
const toastRefs = useRef(new Map());
|
|
77
|
-
// Track last known positions for exiting toasts to prevent animation to top: 0
|
|
78
|
-
const lastPositionsRef = useRef(new Map());
|
|
79
|
-
// Calculate bounds from all toast elements
|
|
80
|
-
const updateBounds = useCallback(() => {
|
|
81
|
-
const refs = toastRefs.current;
|
|
82
|
-
if (refs.size === 0) {
|
|
83
|
-
boundsRef.current = null;
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
87
|
-
refs.forEach((el) => {
|
|
88
|
-
const rect = el.getBoundingClientRect();
|
|
89
|
-
minX = Math.min(minX, rect.left);
|
|
90
|
-
minY = Math.min(minY, rect.top);
|
|
91
|
-
maxX = Math.max(maxX, rect.right);
|
|
92
|
-
maxY = Math.max(maxY, rect.bottom);
|
|
93
|
-
});
|
|
94
|
-
// Use DOMRect if available (browser), otherwise create a plain object (test environment)
|
|
95
|
-
if (typeof DOMRect !== 'undefined') {
|
|
96
|
-
boundsRef.current = new DOMRect(minX, minY, maxX - minX, maxY - minY);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
boundsRef.current = {
|
|
100
|
-
x: minX,
|
|
101
|
-
y: minY,
|
|
102
|
-
width: maxX - minX,
|
|
103
|
-
height: maxY - minY,
|
|
104
|
-
top: minY,
|
|
105
|
-
right: maxX,
|
|
106
|
-
bottom: maxY,
|
|
107
|
-
left: minX,
|
|
108
|
-
toJSON: () => ({}),
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
}, []);
|
|
112
|
-
// Track mouse position to detect when it leaves toast area
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
if (!isCollapsed)
|
|
115
|
-
return;
|
|
116
|
-
const handleMouseMove = (e) => {
|
|
117
|
-
const bounds = boundsRef.current;
|
|
118
|
-
if (!bounds) {
|
|
119
|
-
setIsCollapsed(false);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
// Add some padding to the bounds for smoother UX
|
|
123
|
-
const padding = 20;
|
|
124
|
-
const isInBounds = e.clientX >= bounds.left - padding &&
|
|
125
|
-
e.clientX <= bounds.right + padding &&
|
|
126
|
-
e.clientY >= bounds.top - padding &&
|
|
127
|
-
e.clientY <= bounds.bottom + padding;
|
|
128
|
-
if (!isInBounds) {
|
|
129
|
-
setIsCollapsed(false);
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
window.addEventListener('mousemove', handleMouseMove);
|
|
133
|
-
return () => window.removeEventListener('mousemove', handleMouseMove);
|
|
134
|
-
}, [isCollapsed]);
|
|
135
|
-
// Update bounds when toasts change
|
|
136
|
-
useEffect(() => {
|
|
137
|
-
updateBounds();
|
|
138
|
-
}, [toasts, updateBounds]);
|
|
139
|
-
const handleMouseEnter = useCallback(() => {
|
|
140
|
-
updateBounds();
|
|
141
|
-
setIsCollapsed(true);
|
|
142
|
-
}, [updateBounds]);
|
|
143
|
-
// Measure heights after render using useEffect
|
|
144
|
-
useEffect(() => {
|
|
145
|
-
const newHeights = {};
|
|
146
|
-
let hasChanges = false;
|
|
147
|
-
toastRefs.current.forEach((el, id) => {
|
|
148
|
-
const height = el.offsetHeight || DEFAULT_TOAST_HEIGHT;
|
|
149
|
-
newHeights[id] = height;
|
|
150
|
-
if (heights[id] !== height) {
|
|
151
|
-
hasChanges = true;
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
// Also check for removed toasts
|
|
155
|
-
for (const id of Object.keys(heights)) {
|
|
156
|
-
if (!toastRefs.current.has(id)) {
|
|
157
|
-
hasChanges = true;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (hasChanges) {
|
|
161
|
-
setHeights(newHeights);
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
// Create ref callback that stores refs without triggering updates
|
|
165
|
-
const createRefCallback = useCallback((internalId, displayRef) => (el) => {
|
|
166
|
-
displayRef(el);
|
|
167
|
-
if (el) {
|
|
168
|
-
toastRefs.current.set(internalId, el);
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
toastRefs.current.delete(internalId);
|
|
172
|
-
}
|
|
173
|
-
}, []);
|
|
174
|
-
// Calculate top positions for visible (non-exiting) toasts
|
|
175
|
-
const visibleToasts = toasts.filter((t) => !t.isExiting);
|
|
176
|
-
const positions = useMemo(() => {
|
|
177
|
-
const posMap = new Map();
|
|
178
|
-
let currentTop = 0;
|
|
179
|
-
for (const toast of visibleToasts) {
|
|
180
|
-
posMap.set(toast.internalId, currentTop);
|
|
181
|
-
const height = heights[toast.internalId] ?? DEFAULT_TOAST_HEIGHT;
|
|
182
|
-
currentTop += height + TOAST_GAP;
|
|
183
|
-
}
|
|
184
|
-
return posMap;
|
|
185
|
-
}, [visibleToasts, heights]);
|
|
186
|
-
// Update lastPositionsRef with current positions for visible toasts
|
|
187
|
-
// This preserves positions for toasts that will exit later
|
|
188
|
-
useEffect(() => {
|
|
189
|
-
positions.forEach((pos, id) => {
|
|
190
|
-
lastPositionsRef.current.set(id, pos);
|
|
191
|
-
});
|
|
192
|
-
}, [positions]);
|
|
193
|
-
// Clean up lastPositionsRef when toast exit completes
|
|
194
|
-
const handleExitComplete = useCallback((internalId) => {
|
|
195
|
-
lastPositionsRef.current.delete(internalId);
|
|
196
|
-
onExitComplete(internalId);
|
|
197
|
-
}, [onExitComplete]);
|
|
198
|
-
// Calculate collapsed positions
|
|
199
|
-
const getToastStyle = useCallback((toast, index, total) => {
|
|
200
|
-
// Use current position for visible toasts, or last known position for exiting toasts
|
|
201
|
-
const baseTop = positions.get(toast.internalId) ??
|
|
202
|
-
lastPositionsRef.current.get(toast.internalId) ??
|
|
203
|
-
0;
|
|
204
|
-
const height = heights[toast.internalId] ?? DEFAULT_TOAST_HEIGHT;
|
|
205
|
-
if (!isCollapsed) {
|
|
206
|
-
return { top: `${baseTop}px` };
|
|
207
|
-
}
|
|
208
|
-
// In collapsed state, all toasts overlap completely
|
|
209
|
-
// Only COLLAPSE_VISIBLE_HEIGHT of the toast should be visible from viewport top
|
|
210
|
-
// Container is at CONTAINER_OFFSET from viewport, so we compensate for that
|
|
211
|
-
const isNewest = index === total - 1;
|
|
212
|
-
const collapsedTop = COLLAPSE_VISIBLE_HEIGHT - CONTAINER_OFFSET - height;
|
|
213
|
-
return {
|
|
214
|
-
top: `${collapsedTop}px`,
|
|
215
|
-
zIndex: index, // Newest on top (highest index = highest z)
|
|
216
|
-
opacity: isNewest ? 1 : 0,
|
|
217
|
-
pointerEvents: 'none',
|
|
218
|
-
};
|
|
219
|
-
}, [isCollapsed, positions, heights]);
|
|
220
|
-
if (toasts.length === 0)
|
|
221
|
-
return null;
|
|
222
|
-
return (_jsx(Portal, { children: _jsx(ToastContainerElement, { ref: containerRef, children: toasts.map((toast) => {
|
|
223
|
-
const visibleIndex = visibleToasts.findIndex((t) => t.internalId === toast.internalId);
|
|
224
|
-
return (_jsx(DisplayTransition, { animateOnMount: true, isShown: !toast.isExiting, onRest: (transition) => {
|
|
225
|
-
if (transition === 'exit') {
|
|
226
|
-
handleExitComplete(toast.internalId);
|
|
227
|
-
}
|
|
228
|
-
}, children: ({ isShown, ref }) => (_jsx(ToastWrapper, { ref: createRefCallback(toast.internalId, ref), mods: { isShown }, style: getToastStyle(toast, visibleIndex >= 0 ? visibleIndex : 0, visibleToasts.length), onMouseEnter: handleMouseEnter, children: _jsx(ToastItem, { ...toast.itemProps, title: toast.title, description: toast.description, theme: toast.theme, icon: toast.icon, isLoading: toast.isLoading }) })) }, toast.internalId));
|
|
229
|
-
}) }) }));
|
|
230
|
-
}
|
|
231
|
-
export function ToastProvider({ children }) {
|
|
232
|
-
const [toasts, setToasts] = useState([]);
|
|
233
|
-
const timersRef = useRef(new Map());
|
|
234
|
-
const idCounter = useRef(0);
|
|
235
|
-
const generateId = useCallback(() => {
|
|
236
|
-
idCounter.current += 1;
|
|
237
|
-
return `toast-${idCounter.current}-${Date.now()}`;
|
|
238
|
-
}, []);
|
|
239
|
-
const clearTimer = useCallback((internalId) => {
|
|
240
|
-
const timer = timersRef.current.get(internalId);
|
|
241
|
-
if (timer) {
|
|
242
|
-
clearTimeout(timer);
|
|
243
|
-
timersRef.current.delete(internalId);
|
|
244
|
-
}
|
|
245
|
-
}, []);
|
|
246
|
-
// Mark toast as exiting (triggers exit transition)
|
|
247
|
-
const removeToast = useEvent((id) => {
|
|
248
|
-
setToasts((prev) => {
|
|
249
|
-
const toast = prev.find((t) => t.id === id || t.internalId === String(id));
|
|
250
|
-
if (toast) {
|
|
251
|
-
clearTimer(toast.internalId);
|
|
252
|
-
}
|
|
253
|
-
// Mark as exiting instead of removing immediately
|
|
254
|
-
return prev.map((t) => {
|
|
255
|
-
if (t.id === id || t.internalId === String(id)) {
|
|
256
|
-
return { ...t, isExiting: true };
|
|
257
|
-
}
|
|
258
|
-
return t;
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
// Actually remove the toast from the array after exit transition completes
|
|
263
|
-
const finalizeRemoval = useEvent((internalId) => {
|
|
264
|
-
setToasts((prev) => prev.filter((t) => t.internalId !== internalId));
|
|
265
|
-
});
|
|
266
|
-
const addToast = useEvent((data, isProgress = false) => {
|
|
267
|
-
const internalId = generateId();
|
|
268
|
-
const dedupeKey = generateDedupeKey(data);
|
|
269
|
-
const duration = isProgress ? null : data.duration ?? DEFAULT_DURATION;
|
|
270
|
-
// Mark existing toast with same dedupe key as exiting
|
|
271
|
-
setToasts((prev) => {
|
|
272
|
-
const existingIndex = prev.findIndex((t) => t.dedupeKey === dedupeKey && !t.isExiting);
|
|
273
|
-
if (existingIndex !== -1) {
|
|
274
|
-
const existing = prev[existingIndex];
|
|
275
|
-
clearTimer(existing.internalId);
|
|
276
|
-
// Mark as exiting instead of removing immediately
|
|
277
|
-
return prev.map((t, i) => {
|
|
278
|
-
if (i === existingIndex) {
|
|
279
|
-
return { ...t, isExiting: true };
|
|
280
|
-
}
|
|
281
|
-
return t;
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
return prev;
|
|
285
|
-
});
|
|
286
|
-
const newToast = {
|
|
287
|
-
...data,
|
|
288
|
-
internalId,
|
|
289
|
-
isProgress,
|
|
290
|
-
dedupeKey,
|
|
291
|
-
createdAt: Date.now(),
|
|
292
|
-
};
|
|
293
|
-
setToasts((prev) => {
|
|
294
|
-
let newToasts = [...prev, newToast];
|
|
295
|
-
// Enforce max toasts limit (only count non-exiting toasts)
|
|
296
|
-
const activeToasts = newToasts.filter((t) => !t.isExiting);
|
|
297
|
-
const progressToasts = activeToasts.filter((t) => t.isProgress);
|
|
298
|
-
const temporalToasts = activeToasts.filter((t) => !t.isProgress);
|
|
299
|
-
// If we exceed limit, mark oldest temporal toasts as exiting
|
|
300
|
-
while (activeToasts.length > MAX_TOASTS) {
|
|
301
|
-
// Always allow at least 1 temporal toast even with 3 progress toasts
|
|
302
|
-
if (temporalToasts.length > 1 || progressToasts.length < MAX_TOASTS) {
|
|
303
|
-
const oldestTemporal = temporalToasts.shift();
|
|
304
|
-
if (oldestTemporal) {
|
|
305
|
-
clearTimer(oldestTemporal.internalId);
|
|
306
|
-
newToasts = newToasts.map((t) => {
|
|
307
|
-
if (t.internalId === oldestTemporal.internalId) {
|
|
308
|
-
return { ...t, isExiting: true };
|
|
309
|
-
}
|
|
310
|
-
return t;
|
|
311
|
-
});
|
|
312
|
-
// Update activeToasts count
|
|
313
|
-
const idx = activeToasts.findIndex((t) => t.internalId === oldestTemporal.internalId);
|
|
314
|
-
if (idx !== -1)
|
|
315
|
-
activeToasts.splice(idx, 1);
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return newToasts;
|
|
326
|
-
});
|
|
327
|
-
// Set auto-dismiss timer for non-progress toasts
|
|
328
|
-
if (duration != null && duration > 0) {
|
|
329
|
-
const timer = setTimeout(() => {
|
|
330
|
-
removeToast(data.id ?? internalId);
|
|
331
|
-
}, duration);
|
|
332
|
-
timersRef.current.set(internalId, timer);
|
|
333
|
-
}
|
|
334
|
-
return data.id ?? internalId;
|
|
335
|
-
});
|
|
336
|
-
const updateToast = useEvent((id, data) => {
|
|
337
|
-
setToasts((prev) => prev.map((t) => {
|
|
338
|
-
if (t.id === id || t.internalId === String(id)) {
|
|
339
|
-
return { ...t, ...data };
|
|
340
|
-
}
|
|
341
|
-
return t;
|
|
342
|
-
}));
|
|
343
|
-
});
|
|
344
|
-
// Cleanup timers on unmount
|
|
345
|
-
useEffect(() => {
|
|
346
|
-
return () => {
|
|
347
|
-
timersRef.current.forEach((timer) => clearTimeout(timer));
|
|
348
|
-
timersRef.current.clear();
|
|
349
|
-
};
|
|
350
|
-
}, []);
|
|
351
|
-
const contextValue = useMemo(() => ({
|
|
352
|
-
addToast,
|
|
353
|
-
removeToast,
|
|
354
|
-
updateToast,
|
|
355
|
-
toasts,
|
|
356
|
-
}), [addToast, removeToast, updateToast, toasts]);
|
|
357
|
-
return (_jsxs(ToastContext.Provider, { value: contextValue, children: [children, _jsx(ToastContainer, { toasts: toasts, onExitComplete: finalizeRemoval })] }));
|
|
358
|
-
}
|
|
8
|
+
/**
|
|
9
|
+
* Toast context is now provided by OverlayProvider.
|
|
10
|
+
* This module re-exports useToastContext for backward compatibility.
|
|
11
|
+
*/
|
|
12
|
+
export { useToastContext } from '../Notifications/NotificationContext.js';
|
|
359
13
|
|
|
360
14
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.114.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
import { useEffect, useRef } from 'react';
|
|
10
10
|
import { useToastContext } from './ToastProvider.js';
|
|
11
11
|
import { useProgressToast } from './useProgressToast.js';
|
|
12
|
-
|
|
13
|
-
export { ToastProvider, useToastContext } from './ToastProvider.js';
|
|
12
|
+
export { useToastContext } from './ToastProvider.js';
|
|
14
13
|
export { ToastItem } from './ToastItem.js';
|
|
15
14
|
export { useToast, getThemeIcon } from './useToast.js';
|
|
16
15
|
export { useProgressToast } from './useProgressToast.js';
|
|
@@ -30,14 +29,12 @@ export function Toast(props) {
|
|
|
30
29
|
const { children, ...toastData } = props;
|
|
31
30
|
const { addToast, removeToast, updateToast } = useToastContext();
|
|
32
31
|
const toastIdRef = useRef(null);
|
|
33
|
-
// Apply theme-based icon if not loading and no icon provided
|
|
34
|
-
const icon = getThemeIcon(toastData.theme, toastData.icon, toastData.isLoading);
|
|
35
32
|
useEffect(() => {
|
|
36
33
|
// Add toast on mount
|
|
34
|
+
// Icon is auto-resolved by ToastItem based on theme/isLoading
|
|
37
35
|
toastIdRef.current = addToast({
|
|
38
36
|
...toastData,
|
|
39
37
|
title: toastData.title ?? children,
|
|
40
|
-
icon,
|
|
41
38
|
duration: null, // Persistent while mounted
|
|
42
39
|
}, true);
|
|
43
40
|
return () => {
|
|
@@ -54,7 +51,6 @@ export function Toast(props) {
|
|
|
54
51
|
updateToast(toastIdRef.current, {
|
|
55
52
|
...toastData,
|
|
56
53
|
title: toastData.title ?? children,
|
|
57
|
-
icon,
|
|
58
54
|
});
|
|
59
55
|
}
|
|
60
56
|
}, [
|
|
@@ -65,7 +61,6 @@ export function Toast(props) {
|
|
|
65
61
|
toastData.icon,
|
|
66
62
|
toastData.isLoading,
|
|
67
63
|
toastData.id,
|
|
68
|
-
icon,
|
|
69
64
|
// Note: itemProps is intentionally excluded - it's an object that would cause
|
|
70
65
|
// unnecessary re-runs. Users needing dynamic itemProps should remount the component.
|
|
71
66
|
updateToast,
|