@cube-dev/ui-kit 0.116.0 → 0.116.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +18 -0
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/chunks/cacheKey.js +1 -1
- package/dist/chunks/definitions.js +1 -1
- package/dist/chunks/renderChunk.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +10 -6
- package/dist/components/actions/Banner/Banner.js.map +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.d.ts +0 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +2 -2
- package/dist/components/form/Form/ResetButton/ResetButton.js.map +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.d.ts +0 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +2 -2
- package/dist/components/form/Form/SubmitButton/SubmitButton.js.map +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransition.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +6 -3
- package/dist/components/overlays/Notifications/OverlayContainer.js.map +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +43 -0
- package/dist/components/overlays/Notifications/dismissed-storage.js.map +1 -0
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +5 -2
- package/dist/components/overlays/Notifications/use-notification-state.js.map +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +14 -7
- package/dist/components/overlays/Notifications/use-persistent-state.js.map +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +6 -2
- package/dist/components/overlays/Toast/ToastItem.js.map +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/types.d.ts +2 -0
- package/dist/components/overlays/Toast/useProgressToast.d.ts +4 -1
- package/dist/components/overlays/Toast/useProgressToast.js +9 -7
- package/dist/components/overlays/Toast/useProgressToast.js.map +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/config.js +1 -1
- package/dist/css-writer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/extractor.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/injector/injector.js +1 -1
- package/dist/injector/sheet-manager.js +1 -1
- package/dist/keyframes/index.js +1 -1
- package/dist/parser/classify.js +4 -9
- package/dist/parser/classify.js.map +1 -1
- package/dist/parser/const.js +1 -1
- package/dist/parser/lru.js +1 -1
- package/dist/parser/parser.js +1 -1
- package/dist/parser/tokenizer.js +1 -1
- package/dist/parser/types.js +1 -1
- package/dist/pipeline/conditions.js +1 -1
- package/dist/pipeline/exclusive.js +1 -1
- package/dist/pipeline/index.js +1 -1
- package/dist/pipeline/materialize.js +1 -1
- package/dist/pipeline/parseStateKey.js +1 -1
- package/dist/pipeline/simplify.js +1 -1
- package/dist/plugins/okhsl-plugin.js +6 -4
- package/dist/plugins/okhsl-plugin.js.map +1 -1
- package/dist/properties/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/states/index.js +1 -1
- package/dist/styles/align.js +1 -1
- package/dist/styles/border.js +1 -1
- package/dist/styles/color.js +1 -1
- package/dist/styles/createStyle.js +1 -1
- package/dist/styles/dimension.js +1 -1
- package/dist/styles/display.js +1 -1
- package/dist/styles/fade.js +1 -1
- package/dist/styles/fill.js +1 -1
- package/dist/styles/flow.js +1 -1
- package/dist/styles/gap.js +1 -1
- package/dist/styles/height.js +1 -1
- package/dist/styles/index.js +1 -1
- package/dist/styles/inset.js +1 -1
- package/dist/styles/justify.js +1 -1
- package/dist/styles/margin.js +1 -1
- package/dist/styles/outline.js +1 -1
- package/dist/styles/padding.js +1 -1
- package/dist/styles/predefined.js +1 -1
- package/dist/styles/preset.js +1 -1
- package/dist/styles/radius.js +1 -1
- package/dist/styles/scrollbar.js +1 -1
- package/dist/styles/shadow.js +1 -1
- package/dist/styles/styledScrollbar.js +1 -1
- package/dist/styles/transition.js +1 -1
- package/dist/styles/width.js +1 -1
- package/dist/tasty/chunks/cacheKey.js +1 -1
- package/dist/tasty/chunks/definitions.js +1 -1
- package/dist/tasty/chunks/renderChunk.js +1 -1
- package/dist/tasty/config.js +1 -1
- package/dist/tasty/debug.js +1 -1
- package/dist/tasty/hooks/useGlobalStyles.js +1 -1
- package/dist/tasty/hooks/useKeyframes.js +1 -1
- package/dist/tasty/hooks/useProperty.js +1 -1
- package/dist/tasty/hooks/useRawCSS.js +1 -1
- package/dist/tasty/hooks/useStyles.js +1 -1
- package/dist/tasty/injector/index.js +1 -1
- package/dist/tasty/injector/injector.js +1 -1
- package/dist/tasty/injector/sheet-manager.js +1 -1
- package/dist/tasty/keyframes/index.js +1 -1
- package/dist/tasty/parser/classify.js +4 -9
- package/dist/tasty/parser/classify.js.map +1 -1
- package/dist/tasty/parser/const.js +1 -1
- package/dist/tasty/parser/lru.js +1 -1
- package/dist/tasty/parser/parser.js +1 -1
- package/dist/tasty/parser/tokenizer.js +1 -1
- package/dist/tasty/parser/types.js +1 -1
- package/dist/tasty/pipeline/conditions.js +1 -1
- package/dist/tasty/pipeline/exclusive.js +1 -1
- package/dist/tasty/pipeline/index.js +1 -1
- package/dist/tasty/pipeline/materialize.js +1 -1
- package/dist/tasty/pipeline/parseStateKey.js +1 -1
- package/dist/tasty/pipeline/simplify.js +1 -1
- package/dist/tasty/plugins/okhsl-plugin.js +6 -4
- package/dist/tasty/plugins/okhsl-plugin.js.map +1 -1
- package/dist/tasty/properties/index.js +1 -1
- package/dist/tasty/states/index.js +1 -1
- package/dist/tasty/static/index.js +1 -1
- package/dist/tasty/static/tastyStatic.js +1 -1
- package/dist/tasty/static/types.js +1 -1
- package/dist/tasty/styles/align.js +1 -1
- package/dist/tasty/styles/border.js +1 -1
- package/dist/tasty/styles/color.js +1 -1
- package/dist/tasty/styles/createStyle.js +1 -1
- package/dist/tasty/styles/dimension.js +1 -1
- package/dist/tasty/styles/display.js +1 -1
- package/dist/tasty/styles/fade.js +1 -1
- package/dist/tasty/styles/fill.js +1 -1
- package/dist/tasty/styles/flow.js +1 -1
- package/dist/tasty/styles/gap.js +1 -1
- package/dist/tasty/styles/height.js +1 -1
- package/dist/tasty/styles/index.js +1 -1
- package/dist/tasty/styles/inset.js +1 -1
- package/dist/tasty/styles/justify.js +1 -1
- package/dist/tasty/styles/list.js +1 -1
- package/dist/tasty/styles/margin.js +1 -1
- package/dist/tasty/styles/outline.js +1 -1
- package/dist/tasty/styles/padding.js +1 -1
- package/dist/tasty/styles/predefined.js +1 -1
- package/dist/tasty/styles/preset.js +1 -1
- package/dist/tasty/styles/radius.js +1 -1
- package/dist/tasty/styles/scrollbar.js +1 -1
- package/dist/tasty/styles/shadow.js +1 -1
- package/dist/tasty/styles/styledScrollbar.js +1 -1
- package/dist/tasty/styles/transition.js +1 -1
- package/dist/tasty/styles/width.js +1 -1
- package/dist/tasty/tasty.js +1 -1
- package/dist/tasty/utils/cache-wrapper.js +1 -1
- package/dist/tasty/utils/case-converter.js +1 -1
- package/dist/tasty/utils/colors.js +1 -1
- package/dist/tasty/utils/dotize.js +1 -1
- package/dist/tasty/utils/filter-base-props.js +1 -1
- package/dist/tasty/utils/get-display-name.js +1 -1
- package/dist/tasty/utils/hsl-to-rgb.js +1 -1
- package/dist/tasty/utils/is-dev-env.js +1 -1
- package/dist/tasty/utils/merge-styles.js +1 -1
- package/dist/tasty/utils/mod-attrs.js +1 -1
- package/dist/tasty/utils/okhsl-to-rgb.js +1 -1
- package/dist/tasty/utils/process-tokens.js +1 -1
- package/dist/tasty/utils/resolve-recipes.js +1 -1
- package/dist/tasty/utils/string.js +1 -1
- package/dist/tasty/utils/styles.js +1 -1
- package/dist/tasty/utils/typography.js +1 -1
- package/dist/tasty/utils/warnings.js +1 -1
- package/dist/tasty/zero/babel.js +1 -1
- package/dist/tasty/zero/index.js +1 -1
- package/dist/tasty/zero/next.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/cache-wrapper.js +1 -1
- package/dist/utils/case-converter.js +1 -1
- package/dist/utils/hsl-to-rgb.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/merge-styles.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/okhsl-to-rgb.js +1 -1
- package/dist/utils/process-tokens.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mapProps.js.map +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/resolve-recipes.js +1 -1
- package/dist/utils/string.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
|
+
//#region src/components/overlays/Notifications/dismissed-storage.ts
|
|
3
|
+
const STORAGE_KEY = "cube-ui-dismissed-notifications";
|
|
4
|
+
const TTL_MS = 864e5;
|
|
5
|
+
function readMap() {
|
|
6
|
+
try {
|
|
7
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
8
|
+
if (!raw) return {};
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
} catch {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function writeMap(map) {
|
|
15
|
+
try {
|
|
16
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(map));
|
|
17
|
+
} catch {}
|
|
18
|
+
}
|
|
19
|
+
function saveDismissedId(id) {
|
|
20
|
+
const map = readMap();
|
|
21
|
+
map[String(id)] = Date.now();
|
|
22
|
+
writeMap(map);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Reads the dismissed-IDs map from localStorage, removes entries older than
|
|
26
|
+
* 24 hours, writes the cleaned map back, and returns the remaining valid IDs.
|
|
27
|
+
*/
|
|
28
|
+
function cleanupAndGetValidIds() {
|
|
29
|
+
const map = readMap();
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const validIds = /* @__PURE__ */ new Set();
|
|
32
|
+
let changed = false;
|
|
33
|
+
for (const [id, timestamp] of Object.entries(map)) if (now - timestamp > TTL_MS) {
|
|
34
|
+
delete map[id];
|
|
35
|
+
changed = true;
|
|
36
|
+
} else validIds.add(id);
|
|
37
|
+
if (changed) writeMap(map);
|
|
38
|
+
return validIds;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { cleanupAndGetValidIds, saveDismissedId };
|
|
43
|
+
//# sourceMappingURL=dismissed-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismissed-storage.js","names":[],"sources":["../../../../src/components/overlays/Notifications/dismissed-storage.ts"],"sourcesContent":["import type { Key } from 'react';\n\nconst STORAGE_KEY = 'cube-ui-dismissed-notifications';\nconst TTL_MS = 86_400_000; // 24 hours\n\ntype DismissedMap = Record<string, number>;\n\nfunction readMap(): DismissedMap {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return {};\n\n return JSON.parse(raw) as DismissedMap;\n } catch {\n return {};\n }\n}\n\nfunction writeMap(map: DismissedMap): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(map));\n } catch {\n // SSR, private browsing, or quota exceeded — silently ignore\n }\n}\n\nexport function saveDismissedId(id: Key): void {\n const map = readMap();\n\n map[String(id)] = Date.now();\n writeMap(map);\n}\n\n/**\n * Reads the dismissed-IDs map from localStorage, removes entries older than\n * 24 hours, writes the cleaned map back, and returns the remaining valid IDs.\n */\nexport function cleanupAndGetValidIds(): Set<string> {\n const map = readMap();\n const now = Date.now();\n const validIds = new Set<string>();\n let changed = false;\n\n for (const [id, timestamp] of Object.entries(map)) {\n if (now - timestamp > TTL_MS) {\n delete map[id];\n changed = true;\n } else {\n validIds.add(id);\n }\n }\n\n if (changed) {\n writeMap(map);\n }\n\n return validIds;\n}\n"],"mappings":";;AAEA,MAAM,cAAc;AACpB,MAAM,SAAS;AAIf,SAAS,UAAwB;AAC/B,KAAI;EACF,MAAM,MAAM,aAAa,QAAQ,YAAY;AAE7C,MAAI,CAAC,IAAK,QAAO,EAAE;AAEnB,SAAO,KAAK,MAAM,IAAI;SAChB;AACN,SAAO,EAAE;;;AAIb,SAAS,SAAS,KAAyB;AACzC,KAAI;AACF,eAAa,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;SAChD;;AAKV,SAAgB,gBAAgB,IAAe;CAC7C,MAAM,MAAM,SAAS;AAErB,KAAI,OAAO,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAS,IAAI;;;;;;AAOf,SAAgB,wBAAqC;CACnD,MAAM,MAAM,SAAS;CACrB,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,2BAAW,IAAI,KAAa;CAClC,IAAI,UAAU;AAEd,MAAK,MAAM,CAAC,IAAI,cAAc,OAAO,QAAQ,IAAI,CAC/C,KAAI,MAAM,YAAY,QAAQ;AAC5B,SAAO,IAAI;AACX,YAAU;OAEV,UAAS,IAAI,GAAG;AAIpB,KAAI,QACF,UAAS,IAAI;AAGf,QAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useToastContext } from "./NotificationContext.js";
|
|
3
3
|
import { NotificationAction } from "./NotificationAction.js";
|
|
4
4
|
import { NotificationCard } from "./NotificationCard.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useRef, useState } from "react";
|
|
4
4
|
|
|
@@ -67,7 +67,10 @@ function useNotificationState(timersRef, persistent) {
|
|
|
67
67
|
isRead: true,
|
|
68
68
|
ownerId: notif.ownerId
|
|
69
69
|
});
|
|
70
|
-
else if (reason === "action")
|
|
70
|
+
else if (reason === "action") {
|
|
71
|
+
persistent.saveDismissedPersistentId(notif.id ?? notif.internalId);
|
|
72
|
+
persistent.removePersistentItem(notif.id ?? notif.internalId);
|
|
73
|
+
}
|
|
71
74
|
}
|
|
72
75
|
setNotifications((prev) => prev.map((n) => matchesNotificationId(n, id) ? {
|
|
73
76
|
...n,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-notification-state.js","names":[],"sources":["../../../../src/components/overlays/Notifications/use-notification-state.ts"],"sourcesContent":["import { Key, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\n\nimport type {\n DismissReason,\n InternalNotification,\n OverlayNotificationOptions,\n PersistentNotificationItem,\n} from './types';\nimport type { OverlayTimers } from './use-overlay-timers';\n\n// ─── Constants ───────────────────────────────────────────────────────\n\nconst DEFAULT_NOTIFICATION_DURATION = 3000;\nconst DEFAULT_PERSISTENT_NOTIFICATION_DURATION = 5000;\nconst MAX_NOTIFICATIONS = 5;\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport interface PersistentCallbacks {\n addPersistentItem: (item: PersistentNotificationItem) => void;\n removePersistentItem: (id: Key) => void;\n hasDismissedPersistentId: (id: Key) => boolean;\n isFullyDismissedId: (id: Key) => boolean;\n}\n\nexport interface NotificationState {\n notifications: InternalNotification[];\n notificationsRef: ReturnType<typeof useRef<InternalNotification[]>>;\n addNotification: (\n options: OverlayNotificationOptions,\n ownerId?: string,\n ) => Key;\n removeNotification: (id: Key, reason?: DismissReason) => void;\n updateNotification: (\n id: Key,\n options: Partial<OverlayNotificationOptions>,\n ) => void;\n finalizeNotificationRemoval: (internalId: string) => void;\n removeByOwner: (ownerId: string) => void;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction getDuration(\n notif: OverlayNotificationOptions & { persistent?: boolean },\n): number | null {\n if (notif.duration === null) return null;\n if (notif.duration !== undefined) return notif.duration;\n return notif.persistent\n ? DEFAULT_PERSISTENT_NOTIFICATION_DURATION\n : DEFAULT_NOTIFICATION_DURATION;\n}\n\nfunction matchesNotificationId(item: InternalNotification, id: Key): boolean {\n return item.id === id || item.internalId === String(id);\n}\n\nfunction findNotification(\n list: InternalNotification[],\n id: Key,\n): InternalNotification | undefined {\n return list.find((n) => matchesNotificationId(n, id));\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────\n\n/**\n * @param timersRef - Ref to the shared OverlayTimers instance. Accessed only\n * inside callbacks (never during render), so it is guaranteed to be populated.\n */\nexport function useNotificationState(\n timersRef: ReturnType<typeof useRef<OverlayTimers>>,\n persistent: PersistentCallbacks,\n): NotificationState {\n const [notifications, setNotifications] = useState<InternalNotification[]>(\n [],\n );\n const notificationsRef = useRef(notifications);\n notificationsRef.current = notifications;\n\n const idCounter = useRef(0);\n\n // ─── Evict Helper ──────────────────────────────────────────────\n\n /**\n * Evict the oldest active notification to make room for a new one.\n * Clears its timer and moves it to the persistent list if applicable.\n * Must be called OUTSIDE setState updaters (StrictMode-safe).\n */\n const evictOldest = useEvent((): string | null => {\n const active = notificationsRef.current.filter((n) => !n.isExiting);\n\n if (active.length === 0) return null;\n\n // Oldest by createdAt (active list preserves insertion order)\n const oldest = active[0];\n\n timersRef.current?.clearNotificationTimer(oldest.internalId);\n\n // Eviction counts as a timeout dismissal — move to persistent list if applicable\n if (oldest.persistent) {\n persistent.addPersistentItem({\n id: oldest.id ?? oldest.internalId,\n theme: oldest.theme,\n title: oldest.title,\n description: oldest.description,\n icon: oldest.icon,\n actions: oldest.actions,\n createdAt: oldest.createdAt,\n updatedAt: oldest.updatedAt,\n isRead: false,\n ownerId: oldest.ownerId,\n });\n }\n\n return oldest.internalId;\n });\n\n // ─── Remove ─────────────────────────────────────────────────────\n\n const removeNotification = useEvent(\n (id: Key, reason: DismissReason = 'api') => {\n // Read from ref (synchronous) to perform side effects OUTSIDE the updater.\n // This prevents double-fire in StrictMode and avoids calling setState\n // (addPersistentItem) inside another setState updater.\n const notif = findNotification(notificationsRef.current, id);\n\n if (!notif || notif.isExiting) return;\n\n timersRef.current?.clearNotificationTimer(notif.internalId);\n\n if (notif.persistent) {\n if (reason === 'close' || reason === 'timeout') {\n // Dismiss button, Escape, or auto-dismiss timeout — move to persistent list.\n // If the same id is triggered again, it skips the overlay and updates the\n // persistent list directly.\n persistent.addPersistentItem({\n id: notif.id ?? notif.internalId,\n theme: notif.theme,\n title: notif.title,\n description: notif.description,\n icon: notif.icon,\n actions: notif.actions,\n createdAt: notif.createdAt,\n updatedAt: notif.updatedAt,\n isRead: true,\n ownerId: notif.ownerId,\n });\n } else if (reason === 'action') {\n // User clicked a regular action (not dismiss) — fully dismiss the\n // notification so it never reappears (overlay or persistent list).\n persistent.removePersistentItem(notif.id ?? notif.internalId);\n }\n // reason === 'api' — programmatic cleanup (e.g. component unmount).\n // No persistence, no full-dismiss tracking.\n }\n\n setNotifications((prev) =>\n prev.map((n) =>\n matchesNotificationId(n, id) ? { ...n, isExiting: true } : n,\n ),\n );\n },\n );\n\n // ─── Finalize ──────────────────────────────────────────────────\n\n const finalizeNotificationRemoval = useEvent((internalId: string) => {\n setNotifications((prev) => prev.filter((n) => n.internalId !== internalId));\n });\n\n // ─── Add ────────────────────────────────────────────────────────\n\n const addNotification = useEvent(\n (options: OverlayNotificationOptions, ownerId?: string): Key => {\n idCounter.current += 1;\n const internalId = `notif-${idCounter.current}-${Date.now()}`;\n const now = Date.now();\n const id = options.id ?? internalId;\n\n // If the user explicitly removed this notification from the persistent\n // list, completely ignore it — no overlay, no persistent storage.\n if (options.id != null && persistent.isFullyDismissedId(options.id)) {\n return id;\n }\n\n // If this persistent id was previously dismissed to the persistent list,\n // skip the overlay and update the persistent item directly.\n if (\n options.persistent &&\n options.id != null &&\n persistent.hasDismissedPersistentId(options.id)\n ) {\n persistent.addPersistentItem({\n id,\n theme: options.theme,\n title: options.title,\n description: options.description,\n icon: options.icon,\n actions: options.actions,\n createdAt: now,\n updatedAt: now,\n isRead: false,\n ownerId,\n });\n\n return id;\n }\n\n // Check for existing notification with same id via the ref (synchronous read).\n const existingNotif =\n options.id != null\n ? notificationsRef.current.find(\n (n) => n.id === options.id && !n.isExiting,\n )\n : undefined;\n\n if (existingNotif) {\n // In-place update of an existing notification\n const returnId = existingNotif.id ?? existingNotif.internalId;\n\n const prevTitle = existingNotif.title;\n const prevDescription = existingNotif.description;\n\n // Timer reset on string title/description change\n const titleChanged =\n typeof options.title === 'string' &&\n typeof prevTitle === 'string' &&\n options.title !== prevTitle;\n const descriptionChanged =\n typeof options.description === 'string' &&\n typeof prevDescription === 'string' &&\n options.description !== prevDescription;\n\n if (titleChanged || descriptionChanged) {\n const duration = getDuration(options);\n\n if (duration != null && duration > 0) {\n timersRef.current?.startNotificationTimer(\n existingNotif.internalId,\n existingNotif.id ?? existingNotif.internalId,\n duration,\n );\n }\n }\n\n setNotifications((prev) =>\n prev.map((n) => {\n if (n.internalId === existingNotif.internalId) {\n return {\n ...n,\n ...options,\n internalId: n.internalId,\n createdAt: n.createdAt,\n updatedAt: now,\n ownerId: ownerId ?? n.ownerId,\n };\n }\n return n;\n }),\n );\n\n return returnId;\n }\n\n // New notification — always show immediately, evicting the oldest if at cap.\n // Read from ref (synchronous) to perform side effects OUTSIDE the updater.\n const activeCount = notificationsRef.current.filter(\n (n) => !n.isExiting,\n ).length;\n\n const newNotification: InternalNotification = {\n ...options,\n id,\n internalId,\n createdAt: now,\n updatedAt: now,\n ownerId,\n };\n\n // Evict oldest if at cap (side effects outside updater)\n let evictedInternalId: string | null = null;\n\n if (activeCount >= MAX_NOTIFICATIONS) {\n evictedInternalId = evictOldest();\n }\n\n // Start timer for the new notification\n const duration = getDuration(options);\n\n if (duration != null && duration > 0) {\n timersRef.current?.startNotificationTimer(internalId, id, duration);\n }\n\n setNotifications((prev) => {\n let next = prev;\n\n if (evictedInternalId) {\n next = next.map((n) =>\n n.internalId === evictedInternalId ? { ...n, isExiting: true } : n,\n );\n }\n\n return [...next, newNotification];\n });\n\n return id;\n },\n );\n\n // ─── Update ─────────────────────────────────────────────────────\n\n const updateNotification = useEvent(\n (id: Key, options: Partial<OverlayNotificationOptions>) => {\n setNotifications((prev) =>\n prev.map((n) =>\n matchesNotificationId(n, id)\n ? { ...n, ...options, updatedAt: Date.now() }\n : n,\n ),\n );\n },\n );\n\n // ─── Owner Cleanup ──────────────────────────────────────────────\n\n const removeByOwner = useEvent((ownerId: string) => {\n // Clear timers outside the updater (StrictMode-safe).\n const owned = notificationsRef.current.filter(\n (n) => n.ownerId === ownerId && !n.isExiting,\n );\n\n for (const n of owned) {\n timersRef.current?.clearNotificationTimer(n.internalId);\n }\n\n setNotifications((prev) =>\n prev.map((n) => {\n if (n.ownerId === ownerId && !n.isExiting) {\n return { ...n, isExiting: true };\n }\n return n;\n }),\n );\n });\n\n return {\n notifications,\n notificationsRef,\n addNotification,\n removeNotification,\n updateNotification,\n finalizeNotificationRemoval,\n removeByOwner,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-notification-state.js","names":[],"sources":["../../../../src/components/overlays/Notifications/use-notification-state.ts"],"sourcesContent":["import { Key, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\n\nimport type {\n DismissReason,\n InternalNotification,\n OverlayNotificationOptions,\n PersistentNotificationItem,\n} from './types';\nimport type { OverlayTimers } from './use-overlay-timers';\n\n// ─── Constants ───────────────────────────────────────────────────────\n\nconst DEFAULT_NOTIFICATION_DURATION = 3000;\nconst DEFAULT_PERSISTENT_NOTIFICATION_DURATION = 5000;\nconst MAX_NOTIFICATIONS = 5;\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport interface PersistentCallbacks {\n addPersistentItem: (item: PersistentNotificationItem) => void;\n removePersistentItem: (id: Key) => void;\n hasDismissedPersistentId: (id: Key) => boolean;\n isFullyDismissedId: (id: Key) => boolean;\n saveDismissedPersistentId: (id: Key) => void;\n}\n\nexport interface NotificationState {\n notifications: InternalNotification[];\n notificationsRef: ReturnType<typeof useRef<InternalNotification[]>>;\n addNotification: (\n options: OverlayNotificationOptions,\n ownerId?: string,\n ) => Key;\n removeNotification: (id: Key, reason?: DismissReason) => void;\n updateNotification: (\n id: Key,\n options: Partial<OverlayNotificationOptions>,\n ) => void;\n finalizeNotificationRemoval: (internalId: string) => void;\n removeByOwner: (ownerId: string) => void;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction getDuration(\n notif: OverlayNotificationOptions & { persistent?: boolean },\n): number | null {\n if (notif.duration === null) return null;\n if (notif.duration !== undefined) return notif.duration;\n return notif.persistent\n ? DEFAULT_PERSISTENT_NOTIFICATION_DURATION\n : DEFAULT_NOTIFICATION_DURATION;\n}\n\nfunction matchesNotificationId(item: InternalNotification, id: Key): boolean {\n return item.id === id || item.internalId === String(id);\n}\n\nfunction findNotification(\n list: InternalNotification[],\n id: Key,\n): InternalNotification | undefined {\n return list.find((n) => matchesNotificationId(n, id));\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────\n\n/**\n * @param timersRef - Ref to the shared OverlayTimers instance. Accessed only\n * inside callbacks (never during render), so it is guaranteed to be populated.\n */\nexport function useNotificationState(\n timersRef: ReturnType<typeof useRef<OverlayTimers>>,\n persistent: PersistentCallbacks,\n): NotificationState {\n const [notifications, setNotifications] = useState<InternalNotification[]>(\n [],\n );\n const notificationsRef = useRef(notifications);\n notificationsRef.current = notifications;\n\n const idCounter = useRef(0);\n\n // ─── Evict Helper ──────────────────────────────────────────────\n\n /**\n * Evict the oldest active notification to make room for a new one.\n * Clears its timer and moves it to the persistent list if applicable.\n * Must be called OUTSIDE setState updaters (StrictMode-safe).\n */\n const evictOldest = useEvent((): string | null => {\n const active = notificationsRef.current.filter((n) => !n.isExiting);\n\n if (active.length === 0) return null;\n\n // Oldest by createdAt (active list preserves insertion order)\n const oldest = active[0];\n\n timersRef.current?.clearNotificationTimer(oldest.internalId);\n\n // Eviction counts as a timeout dismissal — move to persistent list if applicable\n if (oldest.persistent) {\n persistent.addPersistentItem({\n id: oldest.id ?? oldest.internalId,\n theme: oldest.theme,\n title: oldest.title,\n description: oldest.description,\n icon: oldest.icon,\n actions: oldest.actions,\n createdAt: oldest.createdAt,\n updatedAt: oldest.updatedAt,\n isRead: false,\n ownerId: oldest.ownerId,\n });\n }\n\n return oldest.internalId;\n });\n\n // ─── Remove ─────────────────────────────────────────────────────\n\n const removeNotification = useEvent(\n (id: Key, reason: DismissReason = 'api') => {\n // Read from ref (synchronous) to perform side effects OUTSIDE the updater.\n // This prevents double-fire in StrictMode and avoids calling setState\n // (addPersistentItem) inside another setState updater.\n const notif = findNotification(notificationsRef.current, id);\n\n if (!notif || notif.isExiting) return;\n\n timersRef.current?.clearNotificationTimer(notif.internalId);\n\n if (notif.persistent) {\n if (reason === 'close' || reason === 'timeout') {\n // Dismiss button, Escape, or auto-dismiss timeout — move to persistent list.\n // If the same id is triggered again, it skips the overlay and updates the\n // persistent list directly.\n persistent.addPersistentItem({\n id: notif.id ?? notif.internalId,\n theme: notif.theme,\n title: notif.title,\n description: notif.description,\n icon: notif.icon,\n actions: notif.actions,\n createdAt: notif.createdAt,\n updatedAt: notif.updatedAt,\n isRead: true,\n ownerId: notif.ownerId,\n });\n } else if (reason === 'action') {\n // User clicked a regular action (not dismiss) — fully dismiss the\n // notification so it never reappears (overlay or persistent list).\n persistent.saveDismissedPersistentId(notif.id ?? notif.internalId);\n persistent.removePersistentItem(notif.id ?? notif.internalId);\n }\n // reason === 'api' — programmatic cleanup (e.g. component unmount).\n // No persistence, no full-dismiss tracking.\n }\n\n setNotifications((prev) =>\n prev.map((n) =>\n matchesNotificationId(n, id) ? { ...n, isExiting: true } : n,\n ),\n );\n },\n );\n\n // ─── Finalize ──────────────────────────────────────────────────\n\n const finalizeNotificationRemoval = useEvent((internalId: string) => {\n setNotifications((prev) => prev.filter((n) => n.internalId !== internalId));\n });\n\n // ─── Add ────────────────────────────────────────────────────────\n\n const addNotification = useEvent(\n (options: OverlayNotificationOptions, ownerId?: string): Key => {\n idCounter.current += 1;\n const internalId = `notif-${idCounter.current}-${Date.now()}`;\n const now = Date.now();\n const id = options.id ?? internalId;\n\n // If the user explicitly removed this notification from the persistent\n // list, completely ignore it — no overlay, no persistent storage.\n if (options.id != null && persistent.isFullyDismissedId(options.id)) {\n return id;\n }\n\n // If this persistent id was previously dismissed to the persistent list,\n // skip the overlay and update the persistent item directly.\n if (\n options.persistent &&\n options.id != null &&\n persistent.hasDismissedPersistentId(options.id)\n ) {\n persistent.addPersistentItem({\n id,\n theme: options.theme,\n title: options.title,\n description: options.description,\n icon: options.icon,\n actions: options.actions,\n createdAt: now,\n updatedAt: now,\n isRead: false,\n ownerId,\n });\n\n return id;\n }\n\n // Check for existing notification with same id via the ref (synchronous read).\n const existingNotif =\n options.id != null\n ? notificationsRef.current.find(\n (n) => n.id === options.id && !n.isExiting,\n )\n : undefined;\n\n if (existingNotif) {\n // In-place update of an existing notification\n const returnId = existingNotif.id ?? existingNotif.internalId;\n\n const prevTitle = existingNotif.title;\n const prevDescription = existingNotif.description;\n\n // Timer reset on string title/description change\n const titleChanged =\n typeof options.title === 'string' &&\n typeof prevTitle === 'string' &&\n options.title !== prevTitle;\n const descriptionChanged =\n typeof options.description === 'string' &&\n typeof prevDescription === 'string' &&\n options.description !== prevDescription;\n\n if (titleChanged || descriptionChanged) {\n const duration = getDuration(options);\n\n if (duration != null && duration > 0) {\n timersRef.current?.startNotificationTimer(\n existingNotif.internalId,\n existingNotif.id ?? existingNotif.internalId,\n duration,\n );\n }\n }\n\n setNotifications((prev) =>\n prev.map((n) => {\n if (n.internalId === existingNotif.internalId) {\n return {\n ...n,\n ...options,\n internalId: n.internalId,\n createdAt: n.createdAt,\n updatedAt: now,\n ownerId: ownerId ?? n.ownerId,\n };\n }\n return n;\n }),\n );\n\n return returnId;\n }\n\n // New notification — always show immediately, evicting the oldest if at cap.\n // Read from ref (synchronous) to perform side effects OUTSIDE the updater.\n const activeCount = notificationsRef.current.filter(\n (n) => !n.isExiting,\n ).length;\n\n const newNotification: InternalNotification = {\n ...options,\n id,\n internalId,\n createdAt: now,\n updatedAt: now,\n ownerId,\n };\n\n // Evict oldest if at cap (side effects outside updater)\n let evictedInternalId: string | null = null;\n\n if (activeCount >= MAX_NOTIFICATIONS) {\n evictedInternalId = evictOldest();\n }\n\n // Start timer for the new notification\n const duration = getDuration(options);\n\n if (duration != null && duration > 0) {\n timersRef.current?.startNotificationTimer(internalId, id, duration);\n }\n\n setNotifications((prev) => {\n let next = prev;\n\n if (evictedInternalId) {\n next = next.map((n) =>\n n.internalId === evictedInternalId ? { ...n, isExiting: true } : n,\n );\n }\n\n return [...next, newNotification];\n });\n\n return id;\n },\n );\n\n // ─── Update ─────────────────────────────────────────────────────\n\n const updateNotification = useEvent(\n (id: Key, options: Partial<OverlayNotificationOptions>) => {\n setNotifications((prev) =>\n prev.map((n) =>\n matchesNotificationId(n, id)\n ? { ...n, ...options, updatedAt: Date.now() }\n : n,\n ),\n );\n },\n );\n\n // ─── Owner Cleanup ──────────────────────────────────────────────\n\n const removeByOwner = useEvent((ownerId: string) => {\n // Clear timers outside the updater (StrictMode-safe).\n const owned = notificationsRef.current.filter(\n (n) => n.ownerId === ownerId && !n.isExiting,\n );\n\n for (const n of owned) {\n timersRef.current?.clearNotificationTimer(n.internalId);\n }\n\n setNotifications((prev) =>\n prev.map((n) => {\n if (n.ownerId === ownerId && !n.isExiting) {\n return { ...n, isExiting: true };\n }\n return n;\n }),\n );\n });\n\n return {\n notifications,\n notificationsRef,\n addNotification,\n removeNotification,\n updateNotification,\n finalizeNotificationRemoval,\n removeByOwner,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useWarn } from "../../../_internal/hooks/use-warn.js";
|
|
4
4
|
import { useNotificationContext } from "./NotificationContext.js";
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
|
+
import { cleanupAndGetValidIds, saveDismissedId } from "./dismissed-storage.js";
|
|
3
4
|
import { useRef, useState } from "react";
|
|
4
5
|
|
|
5
6
|
//#region src/components/overlays/Notifications/use-persistent-state.ts
|
|
6
7
|
function usePersistentState(maxItems) {
|
|
7
8
|
const [persistentItems, setPersistentItems] = useState([]);
|
|
8
|
-
const dismissedPersistentIdsRef = useRef(
|
|
9
|
+
const dismissedPersistentIdsRef = useRef(null);
|
|
10
|
+
if (dismissedPersistentIdsRef.current === null) dismissedPersistentIdsRef.current = cleanupAndGetValidIds();
|
|
9
11
|
const fullyDismissedIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
10
12
|
return {
|
|
11
13
|
persistentItems,
|
|
12
14
|
addPersistentItem: useEvent((item) => {
|
|
13
|
-
if (fullyDismissedIdsRef.current.has(item.id)) return;
|
|
14
|
-
dismissedPersistentIdsRef.current.add(item.id);
|
|
15
|
+
if (fullyDismissedIdsRef.current.has(String(item.id))) return;
|
|
16
|
+
dismissedPersistentIdsRef.current.add(String(item.id));
|
|
17
|
+
saveDismissedId(item.id);
|
|
15
18
|
setPersistentItems((prev) => {
|
|
16
19
|
const existingIndex = prev.findIndex((i) => i.id === item.id);
|
|
17
20
|
let newItems;
|
|
@@ -32,7 +35,7 @@ function usePersistentState(maxItems) {
|
|
|
32
35
|
});
|
|
33
36
|
}),
|
|
34
37
|
removePersistentItem: useEvent((id) => {
|
|
35
|
-
fullyDismissedIdsRef.current.add(id);
|
|
38
|
+
fullyDismissedIdsRef.current.add(String(id));
|
|
36
39
|
setPersistentItems((prev) => prev.filter((i) => i.id !== id));
|
|
37
40
|
}),
|
|
38
41
|
removePersistentItemsByOwner: useEvent((ownerId) => {
|
|
@@ -51,10 +54,14 @@ function usePersistentState(maxItems) {
|
|
|
51
54
|
});
|
|
52
55
|
}),
|
|
53
56
|
hasDismissedPersistentId: useEvent((id) => {
|
|
54
|
-
return dismissedPersistentIdsRef.current.has(id);
|
|
57
|
+
return dismissedPersistentIdsRef.current.has(String(id));
|
|
55
58
|
}),
|
|
56
59
|
isFullyDismissedId: useEvent((id) => {
|
|
57
|
-
return fullyDismissedIdsRef.current.has(id);
|
|
60
|
+
return fullyDismissedIdsRef.current.has(String(id));
|
|
61
|
+
}),
|
|
62
|
+
saveDismissedPersistentId: useEvent((id) => {
|
|
63
|
+
dismissedPersistentIdsRef.current.add(String(id));
|
|
64
|
+
saveDismissedId(id);
|
|
58
65
|
})
|
|
59
66
|
};
|
|
60
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-persistent-state.js","names":[],"sources":["../../../../src/components/overlays/Notifications/use-persistent-state.ts"],"sourcesContent":["import { Key, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\n\nimport type { PersistentNotificationItem } from './types';\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport interface PersistentState {\n persistentItems: PersistentNotificationItem[];\n addPersistentItem: (item: PersistentNotificationItem) => void;\n removePersistentItem: (id: Key) => void;\n removePersistentItemsByOwner: (ownerId: string) => void;\n clearPersistentItems: () => void;\n markAllAsRead: () => void;\n /**\n * Returns true if the given id was previously moved to the persistent list\n * and has NOT been explicitly removed from it (i.e. still archived, or was\n * auto-dismissed but not yet user-dismissed from the persistent list).\n */\n hasDismissedPersistentId: (id: Key) => boolean;\n /**\n * Returns true if the given id was explicitly removed from the persistent\n * list by the user. Such notifications should be completely ignored on\n * subsequent triggers (no overlay, no persistent storage).\n */\n isFullyDismissedId: (id: Key) => boolean;\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────\n\nexport function usePersistentState(maxItems: number): PersistentState {\n const [persistentItems, setPersistentItems] = useState<\n PersistentNotificationItem[]\n >([]);\n\n // Tracks IDs that have been moved to the persistent list at least once.\n // Used to skip the overlay when the same id reappears.\n const dismissedPersistentIdsRef = useRef<Set<
|
|
1
|
+
{"version":3,"file":"use-persistent-state.js","names":[],"sources":["../../../../src/components/overlays/Notifications/use-persistent-state.ts"],"sourcesContent":["import { Key, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\n\nimport { cleanupAndGetValidIds, saveDismissedId } from './dismissed-storage';\n\nimport type { PersistentNotificationItem } from './types';\n\n// ─── Types ───────────────────────────────────────────────────────────\n\nexport interface PersistentState {\n persistentItems: PersistentNotificationItem[];\n addPersistentItem: (item: PersistentNotificationItem) => void;\n removePersistentItem: (id: Key) => void;\n removePersistentItemsByOwner: (ownerId: string) => void;\n clearPersistentItems: () => void;\n markAllAsRead: () => void;\n /**\n * Returns true if the given id was previously moved to the persistent list\n * and has NOT been explicitly removed from it (i.e. still archived, or was\n * auto-dismissed but not yet user-dismissed from the persistent list).\n */\n hasDismissedPersistentId: (id: Key) => boolean;\n /**\n * Returns true if the given id was explicitly removed from the persistent\n * list by the user. Such notifications should be completely ignored on\n * subsequent triggers (no overlay, no persistent storage).\n */\n isFullyDismissedId: (id: Key) => boolean;\n /**\n * Marks an id as dismissed in both the in-memory set and localStorage.\n * Used for `'action'` dismissals that go through `removePersistentItem`\n * instead of `addPersistentItem`.\n */\n saveDismissedPersistentId: (id: Key) => void;\n}\n\n// ─── Hook ────────────────────────────────────────────────────────────\n\nexport function usePersistentState(maxItems: number): PersistentState {\n const [persistentItems, setPersistentItems] = useState<\n PersistentNotificationItem[]\n >([]);\n\n // Tracks IDs that have been moved to the persistent list at least once.\n // Used to skip the overlay when the same id reappears.\n // Lazy-initialized from localStorage so dismissed IDs survive page reloads.\n const dismissedPersistentIdsRef = useRef<Set<string> | null>(null);\n if (dismissedPersistentIdsRef.current === null) {\n dismissedPersistentIdsRef.current = cleanupAndGetValidIds();\n }\n\n // Tracks IDs that were explicitly removed from the persistent list by the\n // user. These should be completely ignored on subsequent triggers.\n const fullyDismissedIdsRef = useRef<Set<string>>(new Set());\n\n const addPersistentItem = useEvent((item: PersistentNotificationItem) => {\n // If the user already dismissed this item from the persistent list, don't re-add it.\n if (fullyDismissedIdsRef.current.has(String(item.id))) return;\n\n dismissedPersistentIdsRef.current!.add(String(item.id));\n saveDismissedId(item.id);\n\n setPersistentItems((prev) => {\n // Upsert by id\n const existingIndex = prev.findIndex((i) => i.id === item.id);\n let newItems: PersistentNotificationItem[];\n\n if (existingIndex !== -1) {\n newItems = [...prev];\n // Updated items are marked unread again\n newItems[existingIndex] = {\n ...newItems[existingIndex],\n ...item,\n isRead: false,\n };\n } else {\n newItems = [{ ...item, isRead: item.isRead ?? false }, ...prev];\n }\n\n // Enforce max cap\n if (newItems.length > maxItems) {\n newItems = newItems.slice(0, maxItems);\n }\n\n // Sort newest first\n newItems.sort((a, b) => b.createdAt - a.createdAt);\n\n return newItems;\n });\n });\n\n const removePersistentItem = useEvent((id: Key) => {\n fullyDismissedIdsRef.current.add(String(id));\n setPersistentItems((prev) => prev.filter((i) => i.id !== id));\n });\n\n const removePersistentItemsByOwner = useEvent((ownerId: string) => {\n setPersistentItems((prev) => prev.filter((i) => i.ownerId !== ownerId));\n });\n\n const clearPersistentItems = useEvent(() => {\n setPersistentItems([]);\n });\n\n const markAllAsRead = useEvent(() => {\n setPersistentItems((prev) => {\n const hasUnread = prev.some((i) => !i.isRead);\n\n if (!hasUnread) return prev;\n\n return prev.map((i) => (i.isRead ? i : { ...i, isRead: true }));\n });\n });\n\n const hasDismissedPersistentId = useEvent((id: Key): boolean => {\n return dismissedPersistentIdsRef.current!.has(String(id));\n });\n\n const isFullyDismissedId = useEvent((id: Key): boolean => {\n return fullyDismissedIdsRef.current.has(String(id));\n });\n\n const saveDismissedPersistentId = useEvent((id: Key): void => {\n dismissedPersistentIdsRef.current!.add(String(id));\n saveDismissedId(id);\n });\n\n return {\n persistentItems,\n addPersistentItem,\n removePersistentItem,\n removePersistentItemsByOwner,\n clearPersistentItems,\n markAllAsRead,\n hasDismissedPersistentId,\n isFullyDismissedId,\n saveDismissedPersistentId,\n };\n}\n"],"mappings":";;;;;;AAuCA,SAAgB,mBAAmB,UAAmC;CACpE,MAAM,CAAC,iBAAiB,sBAAsB,SAE5C,EAAE,CAAC;CAKL,MAAM,4BAA4B,OAA2B,KAAK;AAClE,KAAI,0BAA0B,YAAY,KACxC,2BAA0B,UAAU,uBAAuB;CAK7D,MAAM,uBAAuB,uBAAoB,IAAI,KAAK,CAAC;AA0E3D,QAAO;EACL;EACA,mBA1EwB,UAAU,SAAqC;AAEvE,OAAI,qBAAqB,QAAQ,IAAI,OAAO,KAAK,GAAG,CAAC,CAAE;AAEvD,6BAA0B,QAAS,IAAI,OAAO,KAAK,GAAG,CAAC;AACvD,mBAAgB,KAAK,GAAG;AAExB,uBAAoB,SAAS;IAE3B,MAAM,gBAAgB,KAAK,WAAW,MAAM,EAAE,OAAO,KAAK,GAAG;IAC7D,IAAI;AAEJ,QAAI,kBAAkB,IAAI;AACxB,gBAAW,CAAC,GAAG,KAAK;AAEpB,cAAS,iBAAiB;MACxB,GAAG,SAAS;MACZ,GAAG;MACH,QAAQ;MACT;UAED,YAAW,CAAC;KAAE,GAAG;KAAM,QAAQ,KAAK,UAAU;KAAO,EAAE,GAAG,KAAK;AAIjE,QAAI,SAAS,SAAS,SACpB,YAAW,SAAS,MAAM,GAAG,SAAS;AAIxC,aAAS,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,UAAU;AAElD,WAAO;KACP;IACF;EAyCA,sBAvC2B,UAAU,OAAY;AACjD,wBAAqB,QAAQ,IAAI,OAAO,GAAG,CAAC;AAC5C,uBAAoB,SAAS,KAAK,QAAQ,MAAM,EAAE,OAAO,GAAG,CAAC;IAC7D;EAqCA,8BAnCmC,UAAU,YAAoB;AACjE,uBAAoB,SAAS,KAAK,QAAQ,MAAM,EAAE,YAAY,QAAQ,CAAC;IACvE;EAkCA,sBAhC2B,eAAe;AAC1C,sBAAmB,EAAE,CAAC;IACtB;EA+BA,eA7BoB,eAAe;AACnC,uBAAoB,SAAS;AAG3B,QAAI,CAFc,KAAK,MAAM,MAAM,CAAC,EAAE,OAAO,CAE7B,QAAO;AAEvB,WAAO,KAAK,KAAK,MAAO,EAAE,SAAS,IAAI;KAAE,GAAG;KAAG,QAAQ;KAAM,CAAE;KAC/D;IACF;EAsBA,0BApB+B,UAAU,OAAqB;AAC9D,UAAO,0BAA0B,QAAS,IAAI,OAAO,GAAG,CAAC;IACzD;EAmBA,oBAjByB,UAAU,OAAqB;AACxD,UAAO,qBAAqB,QAAQ,IAAI,OAAO,GAAG,CAAC;IACnD;EAgBA,2BAdgC,UAAU,OAAkB;AAC5D,6BAA0B,QAAS,IAAI,OAAO,GAAG,CAAC;AAClD,mBAAgB,GAAG;IACnB;EAYD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { tasty } from "../../../tasty/tasty.js";
|
|
3
3
|
import { _Item } from "../../content/Item/Item.js";
|
|
4
4
|
import { getThemeIcon } from "./useToast.js";
|
|
@@ -9,7 +9,10 @@ import { jsx } from "react/jsx-runtime";
|
|
|
9
9
|
const StyledItem = tasty(_Item, { styles: {
|
|
10
10
|
shadow: "$shadow",
|
|
11
11
|
transition: "theme, inset",
|
|
12
|
-
pointerEvents:
|
|
12
|
+
pointerEvents: {
|
|
13
|
+
"": "none",
|
|
14
|
+
"has-actions": "auto"
|
|
15
|
+
},
|
|
13
16
|
Description: { preset: "t4" }
|
|
14
17
|
} });
|
|
15
18
|
const ToastItem = forwardRef(function ToastItem(props, ref) {
|
|
@@ -23,6 +26,7 @@ const ToastItem = forwardRef(function ToastItem(props, ref) {
|
|
|
23
26
|
theme,
|
|
24
27
|
icon,
|
|
25
28
|
isLoading,
|
|
29
|
+
isDisabled: false,
|
|
26
30
|
description: children || title ? description : void 0,
|
|
27
31
|
...itemProps,
|
|
28
32
|
children: primaryContent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastItem.js","names":["Item"],"sources":["../../../../src/components/overlays/Toast/ToastItem.tsx"],"sourcesContent":["import { forwardRef, ReactNode } from 'react';\n\nimport { tasty } from '../../../tasty';\nimport { CubeItemProps, Item } from '../../content/Item/Item';\n\nimport { getThemeIcon } from './useToast';\n\nimport type { ToastType } from './types';\n\nexport interface ToastItemProps\n extends Partial<Omit<CubeItemProps, 'type' | 'icon'>> {\n /** Primary content (→ Item children). Also supports description-only for migration. */\n title?: ReactNode;\n /** Secondary content (or primary if no title/children) */\n description?: ReactNode;\n /** Visual theme */\n theme?: ToastType;\n /** Whether the toast is in loading state */\n isLoading?: boolean;\n /** Icon to display (resolved ReactNode, not a dynamic icon function) */\n icon?: ReactNode;\n}\n\nconst StyledItem = tasty(Item, {\n styles: {\n shadow: '$shadow',\n transition: 'theme, inset',\n pointerEvents: 'none',\n\n Description: {\n preset: 't4',\n },\n },\n});\n\nexport const ToastItem = forwardRef<HTMLElement, ToastItemProps>(\n function ToastItem(props, ref) {\n const {\n title,\n description,\n theme,\n isLoading,\n icon: providedIcon,\n children,\n qa,\n ...itemProps\n } = props;\n\n const icon = getThemeIcon(theme, providedIcon, isLoading);\n\n // If only description provided (no title/children), use description as primary content\n const primaryContent = children ?? title ?? description;\n const secondaryContent = children || title ? description : undefined;\n\n return (\n <StyledItem\n ref={ref}\n qa={qa ?? 'Toast'}\n type=\"card\"\n theme={theme}\n icon={icon}\n isLoading={isLoading}\n description={secondaryContent}\n {...itemProps}\n >\n {primaryContent}\n </StyledItem>\n );\n },\n);\n"],"mappings":";;;;;;;;AAuBA,MAAM,aAAa,MAAMA,OAAM,EAC7B,QAAQ;CACN,QAAQ;CACR,YAAY;CACZ,eAAe;
|
|
1
|
+
{"version":3,"file":"ToastItem.js","names":["Item"],"sources":["../../../../src/components/overlays/Toast/ToastItem.tsx"],"sourcesContent":["import { forwardRef, ReactNode } from 'react';\n\nimport { tasty } from '../../../tasty';\nimport { CubeItemProps, Item } from '../../content/Item/Item';\n\nimport { getThemeIcon } from './useToast';\n\nimport type { ToastType } from './types';\n\nexport interface ToastItemProps\n extends Partial<Omit<CubeItemProps, 'type' | 'icon'>> {\n /** Primary content (→ Item children). Also supports description-only for migration. */\n title?: ReactNode;\n /** Secondary content (or primary if no title/children) */\n description?: ReactNode;\n /** Visual theme */\n theme?: ToastType;\n /** Whether the toast is in loading state */\n isLoading?: boolean;\n /** Icon to display (resolved ReactNode, not a dynamic icon function) */\n icon?: ReactNode;\n}\n\nconst StyledItem = tasty(Item, {\n styles: {\n shadow: '$shadow',\n transition: 'theme, inset',\n pointerEvents: {\n '': 'none',\n 'has-actions': 'auto',\n },\n\n Description: {\n preset: 't4',\n },\n },\n});\n\nexport const ToastItem = forwardRef<HTMLElement, ToastItemProps>(\n function ToastItem(props, ref) {\n const {\n title,\n description,\n theme,\n isLoading,\n icon: providedIcon,\n children,\n qa,\n ...itemProps\n } = props;\n\n const icon = getThemeIcon(theme, providedIcon, isLoading);\n\n // If only description provided (no title/children), use description as primary content\n const primaryContent = children ?? title ?? description;\n const secondaryContent = children || title ? description : undefined;\n\n return (\n <StyledItem\n ref={ref}\n qa={qa ?? 'Toast'}\n type=\"card\"\n theme={theme}\n icon={icon}\n isLoading={isLoading}\n isDisabled={false}\n description={secondaryContent}\n {...itemProps}\n >\n {primaryContent}\n </StyledItem>\n );\n },\n);\n"],"mappings":";;;;;;;;AAuBA,MAAM,aAAa,MAAMA,OAAM,EAC7B,QAAQ;CACN,QAAQ;CACR,YAAY;CACZ,eAAe;EACb,IAAI;EACJ,eAAe;EAChB;CAED,aAAa,EACX,QAAQ,MACT;CACF,EACF,CAAC;AAEF,MAAa,YAAY,WACvB,SAAS,UAAU,OAAO,KAAK;CAC7B,MAAM,EACJ,OACA,aACA,OACA,WACA,MAAM,cACN,UACA,IACA,GAAG,cACD;CAEJ,MAAM,OAAO,aAAa,OAAO,cAAc,UAAU;CAGzD,MAAM,iBAAiB,YAAY,SAAS;AAG5C,QACE,oBAAC;EACM;EACL,IAAI,MAAM;EACV,MAAK;EACE;EACD;EACK;EACX,YAAY;EACZ,aAXqB,YAAY,QAAQ,cAAc;EAYvD,GAAI;YAEH;GACU;EAGlB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useToastContext } from "../Notifications/NotificationContext.js";
|
|
3
3
|
import { useProgressToast } from "./useProgressToast.js";
|
|
4
4
|
import { getThemeIcon, useToast } from "./useToast.js";
|
|
@@ -21,6 +21,8 @@ interface ToastData {
|
|
|
21
21
|
isLoading?: boolean;
|
|
22
22
|
/** Duration in ms before auto-dismiss. null = persistent */
|
|
23
23
|
duration?: number | null;
|
|
24
|
+
/** Action buttons rendered inside the toast (e.g. Cancel) */
|
|
25
|
+
actions?: ReactNode;
|
|
24
26
|
/** Additional Item props to pass through */
|
|
25
27
|
itemProps?: Partial<CubeItemProps>;
|
|
26
28
|
}
|
|
@@ -24,9 +24,12 @@ import { ProgressToastEmpty, ProgressToastOptions } from "./types.js";
|
|
|
24
24
|
*
|
|
25
25
|
* // Pass empty value to immediately remove any existing toast:
|
|
26
26
|
* useProgressToast(shouldShow ? { isLoading: true, title: 'Loading...' } : null);
|
|
27
|
+
*
|
|
28
|
+
* // Or call with no argument to dismiss:
|
|
29
|
+
* useProgressToast();
|
|
27
30
|
* ```
|
|
28
31
|
*/
|
|
29
|
-
declare function useProgressToast(options
|
|
32
|
+
declare function useProgressToast(options?: ProgressToastOptions | ProgressToastEmpty): void;
|
|
30
33
|
//#endregion
|
|
31
34
|
export { useProgressToast };
|
|
32
35
|
//# sourceMappingURL=useProgressToast.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { useToastContext } from "../Notifications/NotificationContext.js";
|
|
3
3
|
import { useEffect, useRef } from "react";
|
|
4
4
|
|
|
@@ -38,6 +38,9 @@ function getStringValue(value) {
|
|
|
38
38
|
*
|
|
39
39
|
* // Pass empty value to immediately remove any existing toast:
|
|
40
40
|
* useProgressToast(shouldShow ? { isLoading: true, title: 'Loading...' } : null);
|
|
41
|
+
*
|
|
42
|
+
* // Or call with no argument to dismiss:
|
|
43
|
+
* useProgressToast();
|
|
41
44
|
* ```
|
|
42
45
|
*/
|
|
43
46
|
function useProgressToast(options) {
|
|
@@ -47,7 +50,7 @@ function useProgressToast(options) {
|
|
|
47
50
|
const hideTimerRef = useRef(null);
|
|
48
51
|
const isFirstRenderRef = useRef(true);
|
|
49
52
|
const optionsRef = useRef(options);
|
|
50
|
-
const
|
|
53
|
+
const hasBeenLoadingRef = useRef(false);
|
|
51
54
|
const prevThemeRef = useRef(void 0);
|
|
52
55
|
const prevTitleRef = useRef(void 0);
|
|
53
56
|
const prevDescriptionRef = useRef(void 0);
|
|
@@ -65,7 +68,6 @@ function useProgressToast(options) {
|
|
|
65
68
|
const currentDescription = isEmpty ? void 0 : getStringValue(options.description);
|
|
66
69
|
useEffect(() => {
|
|
67
70
|
const wasLoading = wasLoadingRef.current;
|
|
68
|
-
const wasEmpty = wasEmptyRef.current;
|
|
69
71
|
const isFirstRender = isFirstRenderRef.current;
|
|
70
72
|
const currentOptions = optionsRef.current;
|
|
71
73
|
if (isEmptyOptions(currentOptions)) {
|
|
@@ -74,8 +76,8 @@ function useProgressToast(options) {
|
|
|
74
76
|
removeToast(toastIdRef.current);
|
|
75
77
|
toastIdRef.current = null;
|
|
76
78
|
}
|
|
79
|
+
hasBeenLoadingRef.current = false;
|
|
77
80
|
wasLoadingRef.current = null;
|
|
78
|
-
wasEmptyRef.current = true;
|
|
79
81
|
isFirstRenderRef.current = false;
|
|
80
82
|
prevThemeRef.current = void 0;
|
|
81
83
|
prevTitleRef.current = void 0;
|
|
@@ -105,17 +107,18 @@ function useProgressToast(options) {
|
|
|
105
107
|
}, RESULT_DURATION);
|
|
106
108
|
};
|
|
107
109
|
if (currentIsLoading) {
|
|
110
|
+
hasBeenLoadingRef.current = true;
|
|
108
111
|
clearHideTimer();
|
|
109
112
|
if (toastIdRef.current == null) showToast();
|
|
110
113
|
else if (dataChanged) showToast();
|
|
111
|
-
} else if (
|
|
114
|
+
} else if (wasLoading === true && !currentIsLoading) {
|
|
112
115
|
clearHideTimer();
|
|
113
116
|
if (currentTitle) showToastWithTimer();
|
|
114
117
|
else if (toastIdRef.current != null) {
|
|
115
118
|
removeToast(toastIdRef.current);
|
|
116
119
|
toastIdRef.current = null;
|
|
117
120
|
}
|
|
118
|
-
} else if (!currentIsLoading && !isFirstRender && dataChanged) {
|
|
121
|
+
} else if (!currentIsLoading && !isFirstRender && hasBeenLoadingRef.current && dataChanged) {
|
|
119
122
|
if (currentTitle) {
|
|
120
123
|
clearHideTimer();
|
|
121
124
|
showToastWithTimer();
|
|
@@ -126,7 +129,6 @@ function useProgressToast(options) {
|
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
131
|
wasLoadingRef.current = currentIsLoading;
|
|
129
|
-
wasEmptyRef.current = false;
|
|
130
132
|
isFirstRenderRef.current = false;
|
|
131
133
|
prevThemeRef.current = currentTheme;
|
|
132
134
|
prevTitleRef.current = currentTitle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useProgressToast.js","names":[],"sources":["../../../../src/components/overlays/Toast/useProgressToast.ts"],"sourcesContent":["import { Key, useEffect, useRef } from 'react';\n\nimport { useToastContext } from './ToastProvider';\n\nimport type { ProgressToastEmpty, ProgressToastOptions } from './types';\n\nconst RESULT_DURATION = 3000;\n\n/**\n * Check if the options represent an \"empty\" value (null, undefined, false, or empty object).\n * When empty, the hook should immediately remove any existing toast.\n */\nfunction isEmptyOptions(\n options: ProgressToastOptions | ProgressToastEmpty,\n): options is ProgressToastEmpty {\n if (options == null || options === false) return true;\n if (typeof options === 'object' && Object.keys(options).length === 0)\n return true;\n return false;\n}\n\n// Get string value for comparison (only strings are compared for re-show logic)\nfunction getStringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Hook to display a progress toast that persists while loading.\n *\n * @example\n * ```tsx\n * useProgressToast(\n * isLoading\n * ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }\n * : { isLoading: false, title: 'Saved!', icon: <IconCheck />, theme: 'success' }\n * );\n *\n * // Or with error handling:\n * useProgressToast(\n * isLoading\n * ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }\n * : isError\n * ? { isLoading: false, title: 'Error', description: errorMessage, theme: 'danger' }\n * : { isLoading: false, title: 'Saved!', theme: 'success' }\n * );\n *\n * // Pass empty value to immediately remove any existing toast:\n * useProgressToast(shouldShow ? { isLoading: true, title: 'Loading...' } : null);\n * ```\n */\nexport function useProgressToast(\n options
|
|
1
|
+
{"version":3,"file":"useProgressToast.js","names":[],"sources":["../../../../src/components/overlays/Toast/useProgressToast.ts"],"sourcesContent":["import { Key, useEffect, useRef } from 'react';\n\nimport { useToastContext } from './ToastProvider';\n\nimport type { ProgressToastEmpty, ProgressToastOptions } from './types';\n\nconst RESULT_DURATION = 3000;\n\n/**\n * Check if the options represent an \"empty\" value (null, undefined, false, or empty object).\n * When empty, the hook should immediately remove any existing toast.\n */\nfunction isEmptyOptions(\n options: ProgressToastOptions | ProgressToastEmpty,\n): options is ProgressToastEmpty {\n if (options == null || options === false) return true;\n if (typeof options === 'object' && Object.keys(options).length === 0)\n return true;\n return false;\n}\n\n// Get string value for comparison (only strings are compared for re-show logic)\nfunction getStringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Hook to display a progress toast that persists while loading.\n *\n * @example\n * ```tsx\n * useProgressToast(\n * isLoading\n * ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }\n * : { isLoading: false, title: 'Saved!', icon: <IconCheck />, theme: 'success' }\n * );\n *\n * // Or with error handling:\n * useProgressToast(\n * isLoading\n * ? { isLoading: true, title: 'Saving...', icon: <Spinner /> }\n * : isError\n * ? { isLoading: false, title: 'Error', description: errorMessage, theme: 'danger' }\n * : { isLoading: false, title: 'Saved!', theme: 'success' }\n * );\n *\n * // Pass empty value to immediately remove any existing toast:\n * useProgressToast(shouldShow ? { isLoading: true, title: 'Loading...' } : null);\n *\n * // Or call with no argument to dismiss:\n * useProgressToast();\n * ```\n */\nexport function useProgressToast(\n options?: ProgressToastOptions | ProgressToastEmpty,\n): void {\n const { addToast, removeToast } = useToastContext();\n\n const toastIdRef = useRef<Key | null>(null);\n const wasLoadingRef = useRef<boolean | null>(null);\n const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isFirstRenderRef = useRef(true);\n const optionsRef = useRef(options);\n const hasBeenLoadingRef = useRef(false);\n\n // Track previous string values for re-show comparison\n const prevThemeRef = useRef<string | undefined>(undefined);\n const prevTitleRef = useRef<string | undefined>(undefined);\n const prevDescriptionRef = useRef<string | undefined>(undefined);\n\n // Always update optionsRef to latest\n optionsRef.current = options;\n\n // Clear any pending hide timer\n const clearHideTimer = () => {\n if (hideTimerRef.current) {\n clearTimeout(hideTimerRef.current);\n hideTimerRef.current = null;\n }\n };\n\n // Check if current options are empty\n const isEmpty = isEmptyOptions(options);\n\n // Extract values only when options are not empty\n const isLoading = isEmpty ? false : options.isLoading;\n const currentTheme = isEmpty ? undefined : options.theme;\n const currentTitle = isEmpty ? undefined : getStringValue(options.title);\n const currentDescription = isEmpty\n ? undefined\n : getStringValue(options.description);\n\n useEffect(() => {\n const wasLoading = wasLoadingRef.current;\n const isFirstRender = isFirstRenderRef.current;\n const currentOptions = optionsRef.current;\n const currentIsEmpty = isEmptyOptions(currentOptions);\n\n // Handle empty options - immediately remove any existing toast\n if (currentIsEmpty) {\n clearHideTimer();\n\n if (toastIdRef.current != null) {\n removeToast(toastIdRef.current);\n toastIdRef.current = null;\n }\n\n // Reset loading gate so the next cycle requires isLoading again\n hasBeenLoadingRef.current = false;\n wasLoadingRef.current = null;\n isFirstRenderRef.current = false;\n prevThemeRef.current = undefined;\n prevTitleRef.current = undefined;\n prevDescriptionRef.current = undefined;\n return;\n }\n\n // From here, we know options is a valid ProgressToastOptions\n const { isLoading: currentIsLoading, ...currentToastData } = currentOptions;\n\n // Check if meaningful data changed (only string values)\n const themeChanged = currentTheme !== prevThemeRef.current;\n const titleChanged = currentTitle !== prevTitleRef.current;\n const descriptionChanged =\n currentDescription !== prevDescriptionRef.current;\n const dataChanged = themeChanged || titleChanged || descriptionChanged;\n\n // Helper to create a new toast (removes old one first if exists)\n const showToast = () => {\n // Remove existing toast if any\n if (toastIdRef.current != null) {\n removeToast(toastIdRef.current);\n }\n\n // Create new toast with fresh data\n // Icon auto-resolved by ToastItem based on theme/isLoading\n toastIdRef.current = addToast(\n {\n ...currentToastData,\n isLoading: currentIsLoading,\n duration: null, // Persistent - we control removal\n },\n true, // isProgress = true\n );\n };\n\n // Helper to show toast and schedule removal\n const showToastWithTimer = () => {\n showToast();\n\n // Schedule removal after result duration\n hideTimerRef.current = setTimeout(() => {\n if (toastIdRef.current != null) {\n removeToast(toastIdRef.current);\n toastIdRef.current = null;\n }\n }, RESULT_DURATION);\n };\n\n if (currentIsLoading) {\n // Starting or continuing loading\n hasBeenLoadingRef.current = true;\n clearHideTimer();\n\n if (toastIdRef.current == null) {\n // Create new toast\n showToast();\n } else if (dataChanged) {\n // Toast exists but data changed (e.g., switching back to loading from another state)\n showToast();\n }\n } else if (wasLoading === true && !currentIsLoading) {\n // Transitioning from loading to not loading\n clearHideTimer();\n\n if (currentTitle) {\n // Show result toast with timer\n showToastWithTimer();\n } else {\n // No content - just remove the loading toast immediately\n if (toastIdRef.current != null) {\n removeToast(toastIdRef.current);\n toastIdRef.current = null;\n }\n }\n } else if (\n !currentIsLoading &&\n !isFirstRender &&\n hasBeenLoadingRef.current &&\n dataChanged\n ) {\n // Not loading, data changed after a loading cycle - update or re-show toast\n if (currentTitle) {\n clearHideTimer();\n showToastWithTimer();\n } else if (toastIdRef.current != null) {\n clearHideTimer();\n removeToast(toastIdRef.current);\n toastIdRef.current = null;\n }\n }\n\n // Update refs for next comparison\n wasLoadingRef.current = currentIsLoading;\n isFirstRenderRef.current = false;\n prevThemeRef.current = currentTheme;\n prevTitleRef.current = currentTitle;\n prevDescriptionRef.current = currentDescription;\n }, [\n isEmpty,\n isLoading,\n currentTheme,\n currentTitle,\n currentDescription,\n addToast,\n removeToast,\n ]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearHideTimer();\n\n if (toastIdRef.current != null) {\n removeToast(toastIdRef.current);\n toastIdRef.current = null;\n }\n };\n }, [removeToast]);\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { CheckIcon } from "../../../icons/CheckIcon.js";
|
|
3
3
|
import { DangerIcon } from "../../../icons/DangerIcon.js";
|
|
4
4
|
import { InfoCircleIcon } from "../../../icons/InfoCircleIcon.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../tasty/utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES } from "../../../tasty/styles/list.js";
|
|
4
4
|
import { tasty } from "../../../tasty/tasty.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { _Tooltip } from "./Tooltip.js";
|
|
3
3
|
import { TooltipTrigger } from "./TooltipTrigger.js";
|
|
4
4
|
import { isValidElement, useEffect, useState } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { TooltipContext } from "./context.js";
|
|
3
3
|
import { Block } from "../../Block.js";
|
|
4
4
|
import { _ActiveZone } from "../../content/ActiveZone/ActiveZone.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { usePortal } from "./usePortal.js";
|
|
3
3
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { usePortalContext } from "./PortalProvider.js";
|
|
3
3
|
import { useEffect, useRef, useState } from "react";
|
|
4
4
|
import invariant from "tiny-invariant";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { tasty } from "../../../tasty/tasty.js";
|
|
3
3
|
import { Cube } from "./Cube.js";
|
|
4
4
|
import { SpinsContainer } from "./SpinsContainer.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { tasty } from "../../../tasty/tasty.js";
|
|
3
3
|
import { Block } from "../../Block.js";
|
|
4
4
|
import { InternalSpinner } from "./InternalSpinner.js";
|
package/dist/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.116.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.116.2 | Cube Dev Team */
|
|
2
2
|
import { CUSTOM_UNITS, getGlobalFuncs, getGlobalParser, normalizeColorTokenValue, setGlobalPredefinedTokens } from "./utils/styles.js";
|
|
3
3
|
import { isDevEnv } from "./utils/is-dev-env.js";
|
|
4
4
|
import { normalizeHandlerDefinition, registerHandler } from "./styles/predefined.js";
|
package/dist/css-writer.js
CHANGED
package/dist/data/item-themes.js
CHANGED