@cube-dev/ui-kit 0.104.0 → 0.105.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 +23 -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 -2
- package/es/components/actions/Action/Action.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 +1 -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 +3 -3
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +3 -3
- 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/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 +1 -1
- 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/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toast/ToastItem.js +26 -0
- package/es/components/overlays/Toast/ToastProvider.js +360 -0
- package/es/components/overlays/Toast/index.js +92 -0
- package/es/components/overlays/{Toasts → Toast}/types.js +1 -1
- package/es/components/overlays/Toast/useProgressToast.js +162 -0
- package/es/components/overlays/Toast/useToast.js +96 -0
- 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 +27 -27
- 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 -2
- 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/services/notification.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 +3 -3
- 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 +20 -3
- 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 +12 -3
- 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 +19 -7
- 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/rgb-to-okhsl.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +4 -2
- 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 +2 -4
- 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/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/Toast/ToastItem.d.ts +14 -0
- package/types/components/overlays/Toast/ToastProvider.d.ts +8 -0
- package/types/components/overlays/Toast/index.d.ts +49 -0
- package/types/components/overlays/Toast/types.d.ts +61 -0
- package/types/components/overlays/Toast/useProgressToast.d.ts +23 -0
- package/types/components/overlays/Toast/useToast.d.ts +23 -0
- package/types/index.d.ts +1 -1
- package/types/tasty/config.d.ts +7 -1
- package/es/components/overlays/Toasts/Toast.js +0 -37
- package/es/components/overlays/Toasts/index.js +0 -11
- package/es/components/overlays/Toasts/use-toasts-api.js +0 -42
- package/types/components/overlays/Toasts/Toast.d.ts +0 -15
- package/types/components/overlays/Toasts/index.d.ts +0 -3
- package/types/components/overlays/Toasts/types.d.ts +0 -23
- package/types/components/overlays/Toasts/use-toasts-api.d.ts +0 -6
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.105.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
10
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
11
|
+
import { tasty } from '../../../tasty/index.js';
|
|
12
|
+
import { DisplayTransition } from '../../helpers/DisplayTransition/DisplayTransition.js';
|
|
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
|
+
}
|
|
359
|
+
|
|
360
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.105.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Declarative Toast component
|
|
9
|
+
import { useEffect, useRef } from 'react';
|
|
10
|
+
import { useToastContext } from './ToastProvider.js';
|
|
11
|
+
import { useProgressToast } from './useProgressToast.js';
|
|
12
|
+
export { ToastProvider, useToastContext } from './ToastProvider.js';
|
|
13
|
+
export { ToastItem } from './ToastItem.js';
|
|
14
|
+
export { useToast } from './useToast.js';
|
|
15
|
+
export { useProgressToast } from './useProgressToast.js';
|
|
16
|
+
/**
|
|
17
|
+
* Declarative Toast component that shows a toast while mounted.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* // Simple toast (visible while mounted)
|
|
22
|
+
* <Toast theme="success">Saved successfully</Toast>
|
|
23
|
+
*
|
|
24
|
+
* // With description
|
|
25
|
+
* <Toast title="Success" description="Changes saved" theme="success" />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function Toast(props) {
|
|
29
|
+
const { children, ...toastData } = props;
|
|
30
|
+
const { addToast, removeToast, updateToast } = useToastContext();
|
|
31
|
+
const toastIdRef = useRef(null);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
// Add toast on mount
|
|
34
|
+
toastIdRef.current = addToast({
|
|
35
|
+
...toastData,
|
|
36
|
+
title: toastData.title ?? children,
|
|
37
|
+
duration: null, // Persistent while mounted
|
|
38
|
+
}, true);
|
|
39
|
+
return () => {
|
|
40
|
+
// Remove toast on unmount
|
|
41
|
+
if (toastIdRef.current != null) {
|
|
42
|
+
removeToast(toastIdRef.current);
|
|
43
|
+
toastIdRef.current = null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}, []);
|
|
47
|
+
// Update toast when props change
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (toastIdRef.current != null) {
|
|
50
|
+
updateToast(toastIdRef.current, {
|
|
51
|
+
...toastData,
|
|
52
|
+
title: toastData.title ?? children,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}, [
|
|
56
|
+
children,
|
|
57
|
+
toastData.title,
|
|
58
|
+
toastData.description,
|
|
59
|
+
toastData.theme,
|
|
60
|
+
toastData.icon,
|
|
61
|
+
toastData.isLoading,
|
|
62
|
+
toastData.id,
|
|
63
|
+
// Note: itemProps is intentionally excluded - it's an object that would cause
|
|
64
|
+
// unnecessary re-runs. Users needing dynamic itemProps should remount the component.
|
|
65
|
+
updateToast,
|
|
66
|
+
]);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Declarative Progress Toast component.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```tsx
|
|
74
|
+
* <Toast.Progress
|
|
75
|
+
* {...(isLoading
|
|
76
|
+
* ? { isLoading: true, title: 'Saving...' }
|
|
77
|
+
* : { isLoading: false, title: 'Saved!', theme: 'success' }
|
|
78
|
+
* )}
|
|
79
|
+
* />
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
function ToastProgress(props) {
|
|
83
|
+
const { children, ...progressOptions } = props;
|
|
84
|
+
useProgressToast({
|
|
85
|
+
...progressOptions,
|
|
86
|
+
title: progressOptions.title ?? children,
|
|
87
|
+
});
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
Toast.Progress = ToastProgress;
|
|
91
|
+
|
|
92
|
+
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.105.0
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useEffect, useRef } from 'react';
|
|
9
|
+
import { useToastContext } from './ToastProvider.js';
|
|
10
|
+
const RESULT_DURATION = 3000;
|
|
11
|
+
// Get string value for comparison (only strings are compared for re-show logic)
|
|
12
|
+
function getStringValue(value) {
|
|
13
|
+
return typeof value === 'string' ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Hook to display a progress toast that persists while loading.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* useProgressToast(
|
|
21
|
+
* isLoading
|
|
22
|
+
* ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }
|
|
23
|
+
* : { isLoading: false, title: 'Saved!', icon: <IconCheck />, theme: 'success' }
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* // Or with error handling:
|
|
27
|
+
* useProgressToast(
|
|
28
|
+
* isLoading
|
|
29
|
+
* ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }
|
|
30
|
+
* : isError
|
|
31
|
+
* ? { isLoading: false, title: 'Error', description: errorMessage, theme: 'danger' }
|
|
32
|
+
* : { isLoading: false, title: 'Saved!', theme: 'success' }
|
|
33
|
+
* );
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function useProgressToast(options) {
|
|
37
|
+
const { isLoading, ...toastData } = options;
|
|
38
|
+
const { addToast, removeToast } = useToastContext();
|
|
39
|
+
const toastIdRef = useRef(null);
|
|
40
|
+
const wasLoadingRef = useRef(null);
|
|
41
|
+
const hideTimerRef = useRef(null);
|
|
42
|
+
const isFirstRenderRef = useRef(true);
|
|
43
|
+
const optionsRef = useRef(options);
|
|
44
|
+
// Track previous string values for re-show comparison
|
|
45
|
+
const prevThemeRef = useRef(undefined);
|
|
46
|
+
const prevTitleRef = useRef(undefined);
|
|
47
|
+
const prevDescriptionRef = useRef(undefined);
|
|
48
|
+
// Always update optionsRef to latest
|
|
49
|
+
optionsRef.current = options;
|
|
50
|
+
// Clear any pending hide timer
|
|
51
|
+
const clearHideTimer = () => {
|
|
52
|
+
if (hideTimerRef.current) {
|
|
53
|
+
clearTimeout(hideTimerRef.current);
|
|
54
|
+
hideTimerRef.current = null;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
// Get current string values for comparison
|
|
58
|
+
const currentTheme = toastData.theme;
|
|
59
|
+
const currentTitle = getStringValue(toastData.title);
|
|
60
|
+
const currentDescription = getStringValue(toastData.description);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
const wasLoading = wasLoadingRef.current;
|
|
63
|
+
const isFirstRender = isFirstRenderRef.current;
|
|
64
|
+
const currentOptions = optionsRef.current;
|
|
65
|
+
const { isLoading: currentIsLoading, ...currentToastData } = currentOptions;
|
|
66
|
+
// Check if meaningful data changed (only string values)
|
|
67
|
+
const themeChanged = currentTheme !== prevThemeRef.current;
|
|
68
|
+
const titleChanged = currentTitle !== prevTitleRef.current;
|
|
69
|
+
const descriptionChanged = currentDescription !== prevDescriptionRef.current;
|
|
70
|
+
const dataChanged = themeChanged || titleChanged || descriptionChanged;
|
|
71
|
+
// Helper to create a new toast (removes old one first if exists)
|
|
72
|
+
const showToast = () => {
|
|
73
|
+
// Remove existing toast if any
|
|
74
|
+
if (toastIdRef.current != null) {
|
|
75
|
+
removeToast(toastIdRef.current);
|
|
76
|
+
}
|
|
77
|
+
// Create new toast with fresh data
|
|
78
|
+
toastIdRef.current = addToast({
|
|
79
|
+
...currentToastData,
|
|
80
|
+
isLoading: currentIsLoading,
|
|
81
|
+
duration: null, // Persistent - we control removal
|
|
82
|
+
}, true);
|
|
83
|
+
};
|
|
84
|
+
// Helper to show toast and schedule removal
|
|
85
|
+
const showToastWithTimer = () => {
|
|
86
|
+
showToast();
|
|
87
|
+
// Schedule removal after result duration
|
|
88
|
+
hideTimerRef.current = setTimeout(() => {
|
|
89
|
+
if (toastIdRef.current != null) {
|
|
90
|
+
removeToast(toastIdRef.current);
|
|
91
|
+
toastIdRef.current = null;
|
|
92
|
+
}
|
|
93
|
+
}, RESULT_DURATION);
|
|
94
|
+
};
|
|
95
|
+
if (currentIsLoading) {
|
|
96
|
+
// Starting or continuing loading
|
|
97
|
+
clearHideTimer();
|
|
98
|
+
if (toastIdRef.current == null) {
|
|
99
|
+
// Create new toast
|
|
100
|
+
showToast();
|
|
101
|
+
}
|
|
102
|
+
else if (dataChanged) {
|
|
103
|
+
// Toast exists but data changed (e.g., switching back to loading from another state)
|
|
104
|
+
showToast();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (wasLoading === true && !currentIsLoading) {
|
|
108
|
+
// Transitioning from loading to not loading
|
|
109
|
+
clearHideTimer();
|
|
110
|
+
if (currentTitle) {
|
|
111
|
+
// Show result toast with timer
|
|
112
|
+
showToastWithTimer();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// No content - just remove the loading toast immediately
|
|
116
|
+
if (toastIdRef.current != null) {
|
|
117
|
+
removeToast(toastIdRef.current);
|
|
118
|
+
toastIdRef.current = null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (!currentIsLoading && !isFirstRender && dataChanged) {
|
|
123
|
+
// Not loading, data changed - update or re-show toast
|
|
124
|
+
// But only if there's meaningful content (non-empty title)
|
|
125
|
+
if (currentTitle) {
|
|
126
|
+
clearHideTimer();
|
|
127
|
+
showToastWithTimer();
|
|
128
|
+
}
|
|
129
|
+
else if (toastIdRef.current != null) {
|
|
130
|
+
// No content - hide existing toast
|
|
131
|
+
clearHideTimer();
|
|
132
|
+
removeToast(toastIdRef.current);
|
|
133
|
+
toastIdRef.current = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Update refs for next comparison
|
|
137
|
+
wasLoadingRef.current = currentIsLoading;
|
|
138
|
+
isFirstRenderRef.current = false;
|
|
139
|
+
prevThemeRef.current = currentTheme;
|
|
140
|
+
prevTitleRef.current = currentTitle;
|
|
141
|
+
prevDescriptionRef.current = currentDescription;
|
|
142
|
+
}, [
|
|
143
|
+
isLoading,
|
|
144
|
+
currentTheme,
|
|
145
|
+
currentTitle,
|
|
146
|
+
currentDescription,
|
|
147
|
+
addToast,
|
|
148
|
+
removeToast,
|
|
149
|
+
]);
|
|
150
|
+
// Cleanup on unmount
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
return () => {
|
|
153
|
+
clearHideTimer();
|
|
154
|
+
if (toastIdRef.current != null) {
|
|
155
|
+
removeToast(toastIdRef.current);
|
|
156
|
+
toastIdRef.current = null;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}, [removeToast]);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|