@cube-dev/ui-kit 0.0.0-canary-b46ab85 → 0.0.0-canary-6b0df31
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 +8 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/CollectionItem.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +3 -4
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Banner/Banner.js +1 -1
- package/es/components/actions/Banner/index.js +1 -1
- package/es/components/actions/Button/Button.js +1 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemAction/ItemAction.js +5 -1
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemActionContext.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Link/Link.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +1 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Disclosure/Disclosure.js +1 -1
- package/es/components/content/Disclosure/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/Item/Item.js +1 -1
- package/es/components/content/Item/index.js +1 -1
- package/es/components/content/ItemBadge/ItemBadge.js +1 -1
- package/es/components/content/ItemBadge/index.js +1 -1
- package/es/components/content/Layout/GridLayout.js +1 -1
- package/es/components/content/Layout/Layout.js +1 -1
- package/es/components/content/Layout/LayoutBlock.js +1 -1
- package/es/components/content/Layout/LayoutCenter.js +1 -1
- package/es/components/content/Layout/LayoutContainer.js +2 -1
- package/es/components/content/Layout/LayoutContent.js +1 -1
- package/es/components/content/Layout/LayoutContext.js +1 -1
- package/es/components/content/Layout/LayoutFlex.js +1 -1
- package/es/components/content/Layout/LayoutFooter.js +1 -1
- package/es/components/content/Layout/LayoutGrid.js +1 -1
- package/es/components/content/Layout/LayoutHeader.js +1 -1
- package/es/components/content/Layout/LayoutPane.js +1 -1
- package/es/components/content/Layout/LayoutPanel.js +1 -1
- package/es/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/es/components/content/Layout/LayoutToolbar.js +1 -1
- package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/es/components/content/Layout/index.js +1 -1
- package/es/components/content/Layout/utils.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +1 -1
- package/es/components/content/TextItem/TextItem.js +1 -1
- package/es/components/content/TextItem/index.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/content/highlightText.js +1 -1
- package/es/components/content/use-auto-tooltip.js +1 -1
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +1 -1
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/Picker/Picker.js +1 -1
- package/es/components/fields/Picker/index.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/HueSlider.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +1 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/es/components/helpers/DisplayTransition/index.js +1 -1
- package/es/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/es/components/helpers/index.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/es/components/navigation/Tabs/EditableTitle.js +1 -1
- package/es/components/navigation/Tabs/TabButton.js +1 -1
- package/es/components/navigation/Tabs/TabDropIndicator.js +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/Notifications/Notification.js +89 -0
- package/es/components/overlays/Notifications/NotificationAction.js +63 -0
- package/es/components/overlays/Notifications/NotificationCard.js +76 -0
- package/es/components/overlays/Notifications/NotificationContext.js +44 -0
- package/es/components/overlays/Notifications/NotificationItem.js +63 -0
- package/es/components/overlays/Notifications/OverlayContainer.js +325 -0
- package/es/components/overlays/Notifications/OverlayProvider.js +69 -0
- package/es/components/overlays/Notifications/PersistentNotificationsList.js +104 -0
- package/es/components/overlays/Notifications/format-relative-time.js +55 -0
- package/es/components/overlays/Notifications/index.js +51 -0
- package/es/components/overlays/{NewNotifications/NotificationsList → Notifications}/types.js +1 -1
- package/es/components/overlays/Notifications/use-notification-state.js +205 -0
- package/es/components/overlays/Notifications/use-notifications.js +175 -0
- package/es/components/overlays/Notifications/use-overlay-timers.js +138 -0
- package/es/components/overlays/Notifications/use-persistent-notifications.js +63 -0
- package/es/components/overlays/Notifications/use-persistent-state.js +66 -0
- package/es/components/overlays/Notifications/use-toast-state.js +143 -0
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toast/ToastItem.js +5 -3
- package/es/components/overlays/Toast/ToastProvider.js +6 -352
- package/es/components/overlays/Toast/index.js +3 -8
- package/es/components/overlays/Toast/types.js +1 -1
- package/es/components/overlays/Toast/useProgressToast.js +2 -5
- package/es/components/overlays/Toast/useToast.js +1 -7
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartHeatmapIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/ColumnTotalIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/CubePauseIcon.js +1 -1
- package/es/icons/CubePlayIcon.js +1 -1
- package/es/icons/CurrencyDollarIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DecimalDecreaseIcon.js +1 -1
- package/es/icons/DecimalIncreaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/HierarchyOpenIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/Number123Icon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PercentageIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ProgressBarIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/RowTotalsIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SemanticQueryIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SubtotalsIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/TrashIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +2 -4
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/SimpleLayout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/stories/playground/PlaygroundEditor.js +1 -1
- package/es/stories/playground/PlaygroundLayout.js +1 -1
- package/es/stories/playground/PlaygroundOutput.js +1 -1
- package/es/stories/playground/PlaygroundPreview.js +1 -1
- package/es/stories/playground/components/Button.js +1 -1
- package/es/stories/playground/components/Card.js +1 -1
- package/es/stories/playground/components/ScrollProgress.js +1 -1
- package/es/stories/playground/examples.js +1 -1
- package/es/tasty/chunks/cacheKey.js +1 -1
- package/es/tasty/chunks/definitions.js +1 -1
- package/es/tasty/chunks/index.js +1 -1
- package/es/tasty/chunks/renderChunk.js +1 -1
- package/es/tasty/config.js +1 -1
- package/es/tasty/debug.js +1 -1
- package/es/tasty/hooks/index.js +1 -1
- package/es/tasty/hooks/useGlobalStyles.js +1 -1
- package/es/tasty/hooks/useKeyframes.js +1 -1
- package/es/tasty/hooks/useProperty.js +1 -1
- package/es/tasty/hooks/useRawCSS.js +1 -1
- package/es/tasty/hooks/useStyles.js +1 -1
- package/es/tasty/index.js +1 -6
- package/es/tasty/injector/index.js +1 -1
- package/es/tasty/injector/injector.js +1 -1
- package/es/tasty/injector/sheet-manager.js +1 -1
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/keyframes/index.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/pipeline/conditions.js +1 -1
- package/es/tasty/pipeline/exclusive.js +1 -1
- package/es/tasty/pipeline/index.js +1 -1
- package/es/tasty/pipeline/materialize.js +1 -1
- package/es/tasty/pipeline/parseStateKey.js +1 -1
- package/es/tasty/pipeline/simplify.js +1 -1
- package/es/tasty/plugins/index.js +1 -1
- package/es/tasty/plugins/okhsl-plugin.js +1 -1
- package/es/tasty/plugins/types.js +1 -1
- package/es/tasty/properties/index.js +1 -1
- package/es/tasty/states/index.js +1 -1
- package/es/tasty/static/index.js +1 -1
- package/es/tasty/static/tastyStatic.js +1 -1
- package/es/tasty/static/types.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +1 -1
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filter-base-props.js +1 -1
- package/es/tasty/utils/get-display-name.js +1 -1
- package/es/tasty/utils/hsl-to-rgb.js +1 -1
- package/es/tasty/utils/is-dev-env.js +1 -1
- package/es/tasty/utils/merge-styles.js +1 -1
- package/es/tasty/utils/mod-attrs.js +1 -1
- package/es/tasty/utils/okhsl-to-rgb.js +1 -1
- package/es/tasty/utils/process-tokens.js +1 -1
- package/es/tasty/utils/resolve-recipes.js +1 -1
- package/es/tasty/utils/rgb-to-okhsl.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +9 -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 +1 -1
- package/es/tasty/zero/extractor.js +1 -1
- package/es/tasty/zero/index.js +1 -1
- package/es/tasty/zero/next.js +1 -1
- package/es/tokens/base.js +1 -1
- package/es/tokens/colors.js +1 -1
- package/es/tokens/index.js +1 -1
- package/es/tokens/layout.js +1 -1
- package/es/tokens/shadows.js +1 -1
- package/es/tokens/sizes.js +1 -1
- package/es/tokens/spacing.js +1 -1
- package/es/tokens/typography.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/index.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/raf.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/RenderCache.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/resolveIcon.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useLocalStorage.js +1 -1
- package/es/utils/react/useMergeStyles.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/HiddenInput.d.ts +56 -56
- package/types/components/actions/Button/Button.d.ts +64 -64
- package/types/components/actions/CommandMenu/styled.d.ts +280 -280
- package/types/components/actions/Menu/styled.d.ts +423 -423
- package/types/components/content/List/SectionHeading.d.ts +47 -47
- package/types/components/content/Text.d.ts +112 -112
- package/types/components/fields/DatePicker/DatePickerElement.d.ts +47 -47
- package/types/components/fields/Select/Select.d.ts +56 -56
- package/types/components/fields/Slider/elements.d.ts +338 -338
- package/types/components/navigation/Tabs/styled.d.ts +446 -446
- package/types/components/overlays/Notifications/Notification.d.ts +28 -0
- package/types/components/overlays/Notifications/NotificationAction.d.ts +20 -0
- package/types/components/overlays/Notifications/NotificationCard.d.ts +35 -0
- package/types/components/overlays/Notifications/NotificationContext.d.ts +16 -0
- package/types/components/overlays/Notifications/NotificationItem.d.ts +7 -0
- package/types/components/overlays/Notifications/OverlayContainer.d.ts +12 -0
- package/types/components/overlays/Notifications/OverlayProvider.d.ts +3 -0
- package/types/components/overlays/Notifications/PersistentNotificationsList.d.ts +18 -0
- package/types/components/overlays/Notifications/format-relative-time.d.ts +14 -0
- package/types/components/overlays/Notifications/index.d.ts +40 -0
- package/types/components/overlays/Notifications/types.d.ts +145 -0
- package/types/components/overlays/Notifications/use-notification-state.d.ts +20 -0
- package/types/components/overlays/Notifications/use-notifications.d.ts +36 -0
- package/types/components/overlays/Notifications/use-overlay-timers.d.ts +26 -0
- package/types/components/overlays/Notifications/use-persistent-notifications.d.ts +48 -0
- package/types/components/overlays/Notifications/use-persistent-state.d.ts +11 -0
- package/types/components/overlays/Notifications/use-toast-state.d.ts +16 -0
- package/types/components/overlays/Toast/ToastItem.d.ts +3 -1
- package/types/components/overlays/Toast/ToastProvider.d.ts +5 -8
- package/types/components/overlays/Toast/index.d.ts +1 -1
- package/types/components/overlays/Toast/types.d.ts +3 -1
- package/types/index.d.ts +1 -3
- package/types/tasty/tasty.d.ts +56 -56
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +0 -54
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +0 -95
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +0 -56
- package/es/components/overlays/NewNotifications/Bar/index.js +0 -10
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +0 -19
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +0 -38
- package/es/components/overlays/NewNotifications/Dialog/index.js +0 -10
- package/es/components/overlays/NewNotifications/Notification.js +0 -41
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +0 -41
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +0 -25
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +0 -36
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +0 -60
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +0 -31
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +0 -69
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +0 -25
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +0 -86
- package/es/components/overlays/NewNotifications/NotificationView/index.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationView/types.js +0 -10
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +0 -21
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +0 -11
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +0 -91
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +0 -45
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +0 -29
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +0 -10
- package/es/components/overlays/NewNotifications/hooks/index.js +0 -14
- package/es/components/overlays/NewNotifications/hooks/types.js +0 -10
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +0 -15
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +0 -17
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +0 -29
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +0 -17
- package/es/components/overlays/NewNotifications/index.js +0 -15
- package/es/components/overlays/NewNotifications/types.js +0 -10
- package/es/components/overlays/Notification/Notification.js +0 -80
- package/es/services/notification.js +0 -71
- package/types/components/overlays/NewNotifications/Bar/FloatingNotification.d.ts +0 -15
- package/types/components/overlays/NewNotifications/Bar/NotificationsBar.d.ts +0 -21
- package/types/components/overlays/NewNotifications/Bar/TransitionComponent.d.ts +0 -4
- package/types/components/overlays/NewNotifications/Bar/index.d.ts +0 -1
- package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.d.ts +0 -9
- package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.d.ts +0 -11
- package/types/components/overlays/NewNotifications/Dialog/index.d.ts +0 -1
- package/types/components/overlays/NewNotifications/Notification.d.ts +0 -18
- package/types/components/overlays/NewNotifications/NotificationView/NotificationAction.d.ts +0 -13
- package/types/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.d.ts +0 -4
- package/types/components/overlays/NewNotifications/NotificationView/NotificationDescription.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationFooter.d.ts +0 -13
- package/types/components/overlays/NewNotifications/NotificationView/NotificationHeader.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationIcon.d.ts +0 -9
- package/types/components/overlays/NewNotifications/NotificationView/NotificationProvider.d.ts +0 -10
- package/types/components/overlays/NewNotifications/NotificationView/NotificationView.d.ts +0 -10
- package/types/components/overlays/NewNotifications/NotificationView/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationView/types.d.ts +0 -16
- package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.d.ts +0 -5
- package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.d.ts +0 -4
- package/types/components/overlays/NewNotifications/NotificationsContext/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationsContext/use-notifications.d.ts +0 -8
- package/types/components/overlays/NewNotifications/NotificationsList/NotificationsList.d.ts +0 -21
- package/types/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.d.ts +0 -5
- package/types/components/overlays/NewNotifications/NotificationsList/index.d.ts +0 -2
- package/types/components/overlays/NewNotifications/NotificationsList/types.d.ts +0 -22
- package/types/components/overlays/NewNotifications/hooks/index.d.ts +0 -5
- package/types/components/overlays/NewNotifications/hooks/types.d.ts +0 -10
- package/types/components/overlays/NewNotifications/hooks/use-notification-list-item.d.ts +0 -9
- package/types/components/overlays/NewNotifications/hooks/use-notifications-api.d.ts +0 -1
- package/types/components/overlays/NewNotifications/hooks/use-notifications-list.d.ts +0 -12
- package/types/components/overlays/NewNotifications/hooks/use-notifications-observer.d.ts +0 -2
- package/types/components/overlays/NewNotifications/index.d.ts +0 -8
- package/types/components/overlays/NewNotifications/types.d.ts +0 -76
- package/types/components/overlays/Notification/Notification.d.ts +0 -6
- package/types/services/notification.d.ts +0 -28
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useEffect, useRef } from 'react';
|
|
9
|
+
import { useNotificationContext } from './NotificationContext.js';
|
|
10
|
+
/**
|
|
11
|
+
* Declarative Notification component that shows a notification while mounted.
|
|
12
|
+
* Only supports `mode: 'overlay'` (the default).
|
|
13
|
+
*
|
|
14
|
+
* Semantics:
|
|
15
|
+
* - mount → show or update by `id`
|
|
16
|
+
* - unmount → dismiss unless `disableRemoveOnUnmount`
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <Notification
|
|
21
|
+
* id="release:new-version"
|
|
22
|
+
* theme="warning"
|
|
23
|
+
* title="New release available"
|
|
24
|
+
* description="2.0.0 can be installed now."
|
|
25
|
+
* actions={
|
|
26
|
+
* <>
|
|
27
|
+
* <Notification.Action>Later</Notification.Action>
|
|
28
|
+
* <Notification.Action onPress={() => openUpgradeDialog()}>
|
|
29
|
+
* Upgrade
|
|
30
|
+
* </Notification.Action>
|
|
31
|
+
* </>
|
|
32
|
+
* }
|
|
33
|
+
* />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function Notification(props) {
|
|
37
|
+
const { disableRemoveOnUnmount, ...notificationOptions } = props;
|
|
38
|
+
const { addNotification, removeNotification, updateNotification } = useNotificationContext();
|
|
39
|
+
const notificationIdRef = useRef(null);
|
|
40
|
+
// Tracks how many times the update effect has run. The first run (0 → 1)
|
|
41
|
+
// coincides with mount and must be skipped because addNotification already
|
|
42
|
+
// handles the initial state.
|
|
43
|
+
const renderCountRef = useRef(0);
|
|
44
|
+
const disableRemoveRef = useRef(disableRemoveOnUnmount);
|
|
45
|
+
disableRemoveRef.current = disableRemoveOnUnmount;
|
|
46
|
+
// Show notification on mount
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const id = addNotification({
|
|
49
|
+
...notificationOptions,
|
|
50
|
+
mode: 'overlay',
|
|
51
|
+
duration: notificationOptions.duration ?? null, // Persistent while mounted
|
|
52
|
+
});
|
|
53
|
+
notificationIdRef.current = id;
|
|
54
|
+
return () => {
|
|
55
|
+
if (!disableRemoveRef.current && notificationIdRef.current != null) {
|
|
56
|
+
removeNotification(notificationIdRef.current, 'api');
|
|
57
|
+
notificationIdRef.current = null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}, []);
|
|
61
|
+
// Update notification when props change (skip initial mount)
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
// Skip the first run — it coincides with the mount effect above
|
|
64
|
+
if (renderCountRef.current === 0) {
|
|
65
|
+
renderCountRef.current = 1;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (notificationIdRef.current != null) {
|
|
69
|
+
updateNotification(notificationIdRef.current, {
|
|
70
|
+
...notificationOptions,
|
|
71
|
+
mode: 'overlay',
|
|
72
|
+
duration: notificationOptions.duration ?? null,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}, [
|
|
76
|
+
notificationOptions.id,
|
|
77
|
+
notificationOptions.theme,
|
|
78
|
+
notificationOptions.title,
|
|
79
|
+
notificationOptions.description,
|
|
80
|
+
notificationOptions.icon,
|
|
81
|
+
notificationOptions.actions,
|
|
82
|
+
notificationOptions.isDismissible,
|
|
83
|
+
notificationOptions.persistent,
|
|
84
|
+
notificationOptions.duration,
|
|
85
|
+
]);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
import { createContext, useContext, useMemo, } from 'react';
|
|
10
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
11
|
+
import { ItemAction } from '../../actions/ItemAction/ItemAction.js';
|
|
12
|
+
const NotificationDismissContext = createContext(null);
|
|
13
|
+
export function NotificationDismissProvider({ notificationId, onDismiss, children, }) {
|
|
14
|
+
const dismiss = useEvent(() => {
|
|
15
|
+
onDismiss(notificationId, 'action');
|
|
16
|
+
});
|
|
17
|
+
const value = useMemo(() => ({ dismiss }), [dismiss]);
|
|
18
|
+
return (_jsx(NotificationDismissContext.Provider, { value: value, children: children }));
|
|
19
|
+
}
|
|
20
|
+
// ─── Dismiss Action Detection Context ────────────────────────────────
|
|
21
|
+
//
|
|
22
|
+
// Allows NotificationCard to detect whether any child NotificationAction
|
|
23
|
+
// has `isDismiss` set, without requiring a separate `hasDismissAction` prop.
|
|
24
|
+
//
|
|
25
|
+
// Mechanism:
|
|
26
|
+
// - DismissActionDetector provides a ref via context and resets it each render.
|
|
27
|
+
// - NotificationAction writes to the ref during render when isDismiss is true.
|
|
28
|
+
// - DefaultDismissGuard reads the ref to decide whether to show the default button.
|
|
29
|
+
//
|
|
30
|
+
// This relies on React's left-to-right sibling render order: {actions}
|
|
31
|
+
// children render before <DefaultDismissGuard />, so the ref is populated
|
|
32
|
+
// before it's read. The ref is reset at the provider level each render,
|
|
33
|
+
// making it safe under StrictMode double-rendering.
|
|
34
|
+
export const DismissActionDetectedContext = createContext(null);
|
|
35
|
+
// ─── NotificationAction Component ────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Action button for use inside Notification components.
|
|
38
|
+
* Wraps ItemAction with auto-dismiss behavior.
|
|
39
|
+
*
|
|
40
|
+
* - `closeOnPress` (default: true) — auto-dismisses the notification after `onPress`.
|
|
41
|
+
* - An action with no `onPress` and `closeOnPress: true` acts as a dismiss-only action.
|
|
42
|
+
* - `isDismiss` — marks this action as the dismiss button; when present, the default
|
|
43
|
+
* "Dismiss" button is auto-suppressed via context detection.
|
|
44
|
+
* - Type (primary/secondary/etc.) is set automatically via ItemActionProvider context.
|
|
45
|
+
*/
|
|
46
|
+
export function NotificationAction({ children, onPress, closeOnPress = true, isDisabled, isDismiss, }) {
|
|
47
|
+
const dismissCtx = useContext(NotificationDismissContext);
|
|
48
|
+
const dismissDetectedRef = useContext(DismissActionDetectedContext);
|
|
49
|
+
// Register isDismiss during render (synchronous, before DefaultDismissGuard renders).
|
|
50
|
+
// Safe under StrictMode: the ref is reset at the DismissActionDetector level each render.
|
|
51
|
+
if (isDismiss && dismissDetectedRef) {
|
|
52
|
+
dismissDetectedRef.current = true;
|
|
53
|
+
}
|
|
54
|
+
const handlePress = useEvent(() => {
|
|
55
|
+
onPress?.();
|
|
56
|
+
if (closeOnPress) {
|
|
57
|
+
dismissCtx?.dismiss('action');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return (_jsx(ItemAction, { type: "secondary", isDisabled: isDisabled, onPress: handlePress, children: children }));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useContext, useRef } from 'react';
|
|
10
|
+
import { tasty } from '../../../tasty/index.js';
|
|
11
|
+
import { ItemActionProvider } from '../../actions/ItemActionContext.js';
|
|
12
|
+
import { Block } from '../../Block.js';
|
|
13
|
+
import { Item } from '../../content/Item/Item.js';
|
|
14
|
+
import { Flex } from '../../layout/Flex.js';
|
|
15
|
+
import { Space } from '../../layout/Space.js';
|
|
16
|
+
import { getThemeIcon } from '../Toast/useToast.js';
|
|
17
|
+
import { DismissActionDetectedContext, NotificationAction, NotificationDismissProvider, } from './NotificationAction.js';
|
|
18
|
+
// ─── Styled Components ──────────────────────────────────────────────
|
|
19
|
+
const StyledItem = tasty(Item, {
|
|
20
|
+
styles: {
|
|
21
|
+
width: 'max min((100vw - 4x), 50x)',
|
|
22
|
+
transition: 'theme, inset',
|
|
23
|
+
Description: {
|
|
24
|
+
preset: 't4',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
// ─── Dismiss Action Detection ────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Provides a ref via context that NotificationAction children write to
|
|
31
|
+
* during render when `isDismiss` is set. The ref is reset each render.
|
|
32
|
+
*/
|
|
33
|
+
function DismissActionDetector({ children }) {
|
|
34
|
+
const ref = useRef(false);
|
|
35
|
+
// Reset each render so detection is fresh
|
|
36
|
+
ref.current = false;
|
|
37
|
+
return (_jsx(DismissActionDetectedContext.Provider, { value: ref, children: children }));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Renders the default "Dismiss" button only if no sibling NotificationAction
|
|
41
|
+
* has `isDismiss` set. Reads from DismissActionDetectedContext ref which is
|
|
42
|
+
* populated by actions that rendered before this component (left-to-right order).
|
|
43
|
+
*/
|
|
44
|
+
function AutoDismissButton() {
|
|
45
|
+
const dismissDetectedRef = useContext(DismissActionDetectedContext);
|
|
46
|
+
if (dismissDetectedRef?.current)
|
|
47
|
+
return null;
|
|
48
|
+
return _jsx(NotificationAction, { isDismiss: true, children: "Dismiss" });
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extracted sub-component for the actions area of a notification card.
|
|
52
|
+
*
|
|
53
|
+
* The dismiss provider is always rendered when `hasDismissContext` is true,
|
|
54
|
+
* so any action with `closeOnPress` can close the notification — regardless
|
|
55
|
+
* of `isDismissible`. The `showAutoDismiss` flag only controls the
|
|
56
|
+
* auto-appended "Dismiss" button.
|
|
57
|
+
*/
|
|
58
|
+
function ActionsSection({ actions, theme, showAutoDismiss, hasDismissContext, notificationId, onDismiss, }) {
|
|
59
|
+
const actionsContent = (_jsxs(Space, { placeContent: "end", gap: "1x", flexGrow: 1, children: [actions, showAutoDismiss && _jsx(AutoDismissButton, {})] }));
|
|
60
|
+
const wrappedContent = showAutoDismiss ? (_jsx(DismissActionDetector, { children: actionsContent })) : (actionsContent);
|
|
61
|
+
return (_jsx(ItemActionProvider, { type: "card", theme: theme, children: hasDismissContext ? (_jsx(NotificationDismissProvider, { notificationId: notificationId, onDismiss: onDismiss, children: wrappedContent })) : (wrappedContent) }));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Shared presentational card used by both overlay NotificationItem
|
|
65
|
+
* and PersistentNotificationListItem.
|
|
66
|
+
*/
|
|
67
|
+
export function NotificationCard({ qa = 'Notification', theme, title, description, icon: providedIcon, actions, isDismissible = true, notificationId, onDismiss, suffix, }) {
|
|
68
|
+
const icon = getThemeIcon(theme, providedIcon);
|
|
69
|
+
const hasDismissContext = notificationId != null && onDismiss != null;
|
|
70
|
+
const showAutoDismiss = isDismissible && hasDismissContext;
|
|
71
|
+
const hasActions = !!(actions || showAutoDismiss);
|
|
72
|
+
const descriptionContent = description || hasActions ? (_jsxs(Flex, { flow: "row wrap", gap: "0.5x 1x", placeItems: "center stretch", children: [description && _jsx(Block, { children: description }), hasActions && (_jsx(ActionsSection, { actions: actions, theme: theme, showAutoDismiss: showAutoDismiss, hasDismissContext: hasDismissContext, notificationId: notificationId, onDismiss: onDismiss }))] })) : undefined;
|
|
73
|
+
return (_jsx(StyledItem, { qa: qa, type: "card", theme: theme, icon: icon, description: descriptionContent, suffix: suffix, children: title }));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createContext, useContext } from 'react';
|
|
9
|
+
// ─── Contexts ─────────────────────────────────────────────────────────
|
|
10
|
+
export const ToastContext = createContext(null);
|
|
11
|
+
/**
|
|
12
|
+
* Internal context for overlay notification machinery.
|
|
13
|
+
* Not exported publicly — consumers should use `useNotifications` hook.
|
|
14
|
+
*/
|
|
15
|
+
export const NotificationContext = createContext(null);
|
|
16
|
+
/**
|
|
17
|
+
* Public context for persistent notifications.
|
|
18
|
+
* Used by `usePersistentNotifications` and `useNotificationsCount` hooks.
|
|
19
|
+
*/
|
|
20
|
+
export const PersistentNotificationsContext = createContext(null);
|
|
21
|
+
// ─── Context Hooks ────────────────────────────────────────────────────
|
|
22
|
+
export function useToastContext() {
|
|
23
|
+
const context = useContext(ToastContext);
|
|
24
|
+
if (!context) {
|
|
25
|
+
throw new Error('useToastContext must be used within an OverlayProvider');
|
|
26
|
+
}
|
|
27
|
+
return context;
|
|
28
|
+
}
|
|
29
|
+
export function useNotificationContext() {
|
|
30
|
+
const context = useContext(NotificationContext);
|
|
31
|
+
if (!context) {
|
|
32
|
+
throw new Error('useNotificationContext must be used within an OverlayProvider');
|
|
33
|
+
}
|
|
34
|
+
return context;
|
|
35
|
+
}
|
|
36
|
+
export function usePersistentNotificationsContext() {
|
|
37
|
+
const context = useContext(PersistentNotificationsContext);
|
|
38
|
+
if (!context) {
|
|
39
|
+
throw new Error('usePersistentNotificationsContext must be used within an OverlayProvider');
|
|
40
|
+
}
|
|
41
|
+
return context;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
10
|
+
import { tasty } from '../../../tasty/index.js';
|
|
11
|
+
import { NotificationCard } from './NotificationCard.js';
|
|
12
|
+
// ─── ARIA Helpers ────────────────────────────────────────────────────
|
|
13
|
+
function getAriaRole(theme) {
|
|
14
|
+
if (theme === 'danger' || theme === 'warning') {
|
|
15
|
+
return 'alert';
|
|
16
|
+
}
|
|
17
|
+
return 'status';
|
|
18
|
+
}
|
|
19
|
+
function getAriaLive(theme) {
|
|
20
|
+
if (theme === 'danger' || theme === 'warning') {
|
|
21
|
+
return 'assertive';
|
|
22
|
+
}
|
|
23
|
+
return 'polite';
|
|
24
|
+
}
|
|
25
|
+
// ─── Styled Wrapper ──────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Wrapper element for overlay notification items.
|
|
28
|
+
*
|
|
29
|
+
* Accessibility attributes are set as static defaults:
|
|
30
|
+
* - `tabIndex={0}`: Makes the notification focusable via keyboard, allowing
|
|
31
|
+
* users to Tab to it and press Escape to dismiss.
|
|
32
|
+
* - `aria-atomic="true"`: Ensures screen readers announce the entire notification
|
|
33
|
+
* when content changes (not just the diff).
|
|
34
|
+
* - `aria-relevant="additions text"`: Announces when new content is added or
|
|
35
|
+
* text changes, but not when elements are removed (e.g., during exit animation).
|
|
36
|
+
*
|
|
37
|
+
* The `role` and `aria-live` are set dynamically per-instance based on theme
|
|
38
|
+
* (see `getAriaRole` and `getAriaLive` above).
|
|
39
|
+
*/
|
|
40
|
+
const NotificationItemWrapper = tasty({
|
|
41
|
+
as: 'div',
|
|
42
|
+
tabIndex: 0,
|
|
43
|
+
'aria-atomic': 'true',
|
|
44
|
+
'aria-relevant': 'additions text',
|
|
45
|
+
styles: {
|
|
46
|
+
outline: {
|
|
47
|
+
'': 'none',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
export function NotificationItem({ notification, onDismiss, }) {
|
|
52
|
+
const { theme, title, description, icon, actions, isDismissible = true, id, internalId, } = notification;
|
|
53
|
+
const notificationId = id ?? internalId;
|
|
54
|
+
const handleKeyDown = useEvent((e) => {
|
|
55
|
+
if (e.key === 'Escape' && isDismissible) {
|
|
56
|
+
e.stopPropagation();
|
|
57
|
+
onDismiss(notificationId, 'close');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return (_jsx(NotificationItemWrapper, { role: getAriaRole(theme), "aria-live": getAriaLive(theme), onKeyDown: handleKeyDown, children: _jsx(NotificationCard, { qa: "Notification", theme: theme, title: title, description: description, icon: icon, actions: actions, isDismissible: isDismissible, notificationId: notificationId, onDismiss: onDismiss }) }));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-6b0df31
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
10
|
+
import { useEvent } from '../../../_internal/index.js';
|
|
11
|
+
import { tasty } from '../../../tasty/index.js';
|
|
12
|
+
import { useLayoutEffect } from '../../../utils/react/useLayoutEffect.js';
|
|
13
|
+
import { DisplayTransition } from '../../helpers/DisplayTransition/DisplayTransition.js';
|
|
14
|
+
import { Portal } from '../../portal/index.js';
|
|
15
|
+
import { ToastItem } from '../Toast/ToastItem.js';
|
|
16
|
+
import { NotificationItem } from './NotificationItem.js';
|
|
17
|
+
// ─── Constants ───────────────────────────────────────────────────────
|
|
18
|
+
const COLLAPSE_VISIBLE_HEIGHT = 10;
|
|
19
|
+
const CONTAINER_OFFSET = 16;
|
|
20
|
+
const ITEM_GAP = 8;
|
|
21
|
+
const DEFAULT_ITEM_HEIGHT = 56;
|
|
22
|
+
// ─── Styled Elements ─────────────────────────────────────────────────
|
|
23
|
+
const OverlayContainerElement = tasty({
|
|
24
|
+
styles: {
|
|
25
|
+
position: 'fixed',
|
|
26
|
+
top: '2x',
|
|
27
|
+
left: '50%',
|
|
28
|
+
transform: 'translateX(-50%)',
|
|
29
|
+
zIndex: 10000,
|
|
30
|
+
padding: '1x',
|
|
31
|
+
height: '0',
|
|
32
|
+
pointerEvents: 'none',
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
const OverlayItemWrapper = tasty({
|
|
36
|
+
styles: {
|
|
37
|
+
position: 'absolute',
|
|
38
|
+
top: '0',
|
|
39
|
+
left: '50%',
|
|
40
|
+
transform: {
|
|
41
|
+
'': 'translateX(-50%) translateY(-50%)',
|
|
42
|
+
'isMeasured & isShown': 'translateX(-50%) translateY(0)',
|
|
43
|
+
},
|
|
44
|
+
width: 'max-content 50x',
|
|
45
|
+
pointerEvents: 'auto',
|
|
46
|
+
transition: {
|
|
47
|
+
'': 'opacity $transition ease-in, transform $transition ease-in',
|
|
48
|
+
isMeasured: 'top $transition ease-in, opacity $transition ease-in, transform $transition ease-in',
|
|
49
|
+
},
|
|
50
|
+
opacity: {
|
|
51
|
+
'': 0,
|
|
52
|
+
isShown: 1,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
function getItemId(item) {
|
|
57
|
+
return item.data.internalId;
|
|
58
|
+
}
|
|
59
|
+
function isItemExiting(item) {
|
|
60
|
+
return item.data.isExiting === true;
|
|
61
|
+
}
|
|
62
|
+
function getItemCreatedAt(item) {
|
|
63
|
+
return item.data.createdAt;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Manages height measurement, position calculation, and ref tracking
|
|
67
|
+
* for overlay items. Extracted from OverlayContainer for readability.
|
|
68
|
+
*/
|
|
69
|
+
function useItemPositions(visibleItems) {
|
|
70
|
+
const [heights, setHeights] = useState({});
|
|
71
|
+
const itemRefs = useRef(new Map());
|
|
72
|
+
const lastPositionsRef = useRef(new Map());
|
|
73
|
+
// Items that have been measured AND painted at their correct position.
|
|
74
|
+
// Lags one frame behind `heights` so the browser paints the item at
|
|
75
|
+
// its final `top` before the CSS `top` transition is enabled.
|
|
76
|
+
const [settledIds, setSettledIds] = useState(new Set());
|
|
77
|
+
const rafRef = useRef(null);
|
|
78
|
+
// Measure heights using layout effect to avoid visible layout shifts.
|
|
79
|
+
// Runs every render but bails early if nothing changed.
|
|
80
|
+
useLayoutEffect(() => {
|
|
81
|
+
const newHeights = {};
|
|
82
|
+
let hasChanges = false;
|
|
83
|
+
itemRefs.current.forEach((el, id) => {
|
|
84
|
+
const height = el.offsetHeight || DEFAULT_ITEM_HEIGHT;
|
|
85
|
+
newHeights[id] = height;
|
|
86
|
+
if (heights[id] !== height) {
|
|
87
|
+
hasChanges = true;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
for (const id of Object.keys(heights)) {
|
|
91
|
+
if (!itemRefs.current.has(id)) {
|
|
92
|
+
hasChanges = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (hasChanges) {
|
|
96
|
+
setHeights(newHeights);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// After heights change, schedule settledIds update for the next frame.
|
|
100
|
+
// This ensures the item is painted at its correct position (with no top
|
|
101
|
+
// transition) before we enable the transition.
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
const newIds = Object.keys(heights).filter((id) => !settledIds.has(id));
|
|
104
|
+
if (newIds.length === 0)
|
|
105
|
+
return;
|
|
106
|
+
if (rafRef.current != null) {
|
|
107
|
+
cancelAnimationFrame(rafRef.current);
|
|
108
|
+
}
|
|
109
|
+
rafRef.current = requestAnimationFrame(() => {
|
|
110
|
+
rafRef.current = null;
|
|
111
|
+
setSettledIds((prev) => {
|
|
112
|
+
const next = new Set(prev);
|
|
113
|
+
for (const id of newIds) {
|
|
114
|
+
next.add(id);
|
|
115
|
+
}
|
|
116
|
+
return next;
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
return () => {
|
|
120
|
+
if (rafRef.current != null) {
|
|
121
|
+
cancelAnimationFrame(rafRef.current);
|
|
122
|
+
rafRef.current = null;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}, [heights]);
|
|
126
|
+
const createRefCallback = useCallback((itemId, displayRef) => (el) => {
|
|
127
|
+
displayRef(el);
|
|
128
|
+
if (el) {
|
|
129
|
+
itemRefs.current.set(itemId, el);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
itemRefs.current.delete(itemId);
|
|
133
|
+
}
|
|
134
|
+
}, []);
|
|
135
|
+
const positions = useMemo(() => {
|
|
136
|
+
const posMap = new Map();
|
|
137
|
+
let currentTop = 0;
|
|
138
|
+
for (const item of visibleItems) {
|
|
139
|
+
const id = getItemId(item);
|
|
140
|
+
posMap.set(id, currentTop);
|
|
141
|
+
const height = heights[id] ?? DEFAULT_ITEM_HEIGHT;
|
|
142
|
+
currentTop += height + ITEM_GAP;
|
|
143
|
+
}
|
|
144
|
+
return posMap;
|
|
145
|
+
}, [visibleItems, heights]);
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
positions.forEach((pos, id) => {
|
|
148
|
+
lastPositionsRef.current.set(id, pos);
|
|
149
|
+
});
|
|
150
|
+
}, [positions]);
|
|
151
|
+
return {
|
|
152
|
+
heights,
|
|
153
|
+
settledIds,
|
|
154
|
+
positions,
|
|
155
|
+
lastPositionsRef,
|
|
156
|
+
itemRefs,
|
|
157
|
+
createRefCallback,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Manages collapse/expand behavior and pause state for the overlay container.
|
|
162
|
+
* Extracted from OverlayContainer for readability.
|
|
163
|
+
*/
|
|
164
|
+
function useCollapseState(canCollapse, allItems, itemRefs, onPauseChange) {
|
|
165
|
+
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
166
|
+
const containerRef = useRef(null);
|
|
167
|
+
const boundsRef = useRef(null);
|
|
168
|
+
const updateBounds = useCallback(() => {
|
|
169
|
+
const refs = itemRefs.current;
|
|
170
|
+
if (!refs || refs.size === 0) {
|
|
171
|
+
boundsRef.current = null;
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
175
|
+
refs.forEach((el) => {
|
|
176
|
+
const rect = el.getBoundingClientRect();
|
|
177
|
+
minX = Math.min(minX, rect.left);
|
|
178
|
+
minY = Math.min(minY, rect.top);
|
|
179
|
+
maxX = Math.max(maxX, rect.right);
|
|
180
|
+
maxY = Math.max(maxY, rect.bottom);
|
|
181
|
+
});
|
|
182
|
+
if (typeof DOMRect !== 'undefined') {
|
|
183
|
+
boundsRef.current = new DOMRect(minX, minY, maxX - minX, maxY - minY);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
boundsRef.current = {
|
|
187
|
+
x: minX,
|
|
188
|
+
y: minY,
|
|
189
|
+
width: maxX - minX,
|
|
190
|
+
height: maxY - minY,
|
|
191
|
+
top: minY,
|
|
192
|
+
right: maxX,
|
|
193
|
+
bottom: maxY,
|
|
194
|
+
left: minX,
|
|
195
|
+
toJSON: () => ({}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}, [itemRefs]);
|
|
199
|
+
// Track mouse for collapse — expand when mouse leaves bounds
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
if (!isCollapsed)
|
|
202
|
+
return;
|
|
203
|
+
const handleMouseMove = (e) => {
|
|
204
|
+
const bounds = boundsRef.current;
|
|
205
|
+
if (!bounds) {
|
|
206
|
+
setIsCollapsed(false);
|
|
207
|
+
onPauseChange(false);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const padding = 20;
|
|
211
|
+
const isInBounds = e.clientX >= bounds.left - padding &&
|
|
212
|
+
e.clientX <= bounds.right + padding &&
|
|
213
|
+
e.clientY >= bounds.top - padding &&
|
|
214
|
+
e.clientY <= bounds.bottom + padding;
|
|
215
|
+
if (!isInBounds) {
|
|
216
|
+
setIsCollapsed(false);
|
|
217
|
+
onPauseChange(false);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
window.addEventListener('mousemove', handleMouseMove);
|
|
221
|
+
return () => window.removeEventListener('mousemove', handleMouseMove);
|
|
222
|
+
}, [isCollapsed, onPauseChange]);
|
|
223
|
+
// Update bounds when items change
|
|
224
|
+
useEffect(() => {
|
|
225
|
+
updateBounds();
|
|
226
|
+
}, [allItems, updateBounds]);
|
|
227
|
+
const handleMouseEnter = useCallback(() => {
|
|
228
|
+
updateBounds();
|
|
229
|
+
onPauseChange(true);
|
|
230
|
+
if (canCollapse) {
|
|
231
|
+
setIsCollapsed(true);
|
|
232
|
+
}
|
|
233
|
+
}, [updateBounds, canCollapse, onPauseChange]);
|
|
234
|
+
const handleMouseLeave = useCallback(() => {
|
|
235
|
+
if (!isCollapsed) {
|
|
236
|
+
onPauseChange(false);
|
|
237
|
+
}
|
|
238
|
+
}, [isCollapsed, onPauseChange]);
|
|
239
|
+
const handleFocus = useCallback(() => {
|
|
240
|
+
onPauseChange(true);
|
|
241
|
+
}, [onPauseChange]);
|
|
242
|
+
const handleBlur = useCallback((e) => {
|
|
243
|
+
if (containerRef.current &&
|
|
244
|
+
!containerRef.current.contains(e.relatedTarget)) {
|
|
245
|
+
onPauseChange(false);
|
|
246
|
+
}
|
|
247
|
+
}, [onPauseChange]);
|
|
248
|
+
return {
|
|
249
|
+
isCollapsed,
|
|
250
|
+
handleMouseEnter,
|
|
251
|
+
handleMouseLeave,
|
|
252
|
+
handleFocus,
|
|
253
|
+
handleBlur,
|
|
254
|
+
containerRef,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export function OverlayContainer({ toasts, notifications, onToastExitComplete, onNotificationExitComplete, onNotificationDismiss, onPauseChange, }) {
|
|
258
|
+
// Merge toasts and notifications into a single ordered list
|
|
259
|
+
const allItems = useMemo(() => {
|
|
260
|
+
const items = [
|
|
261
|
+
...toasts.map((t) => ({ kind: 'toast', data: t })),
|
|
262
|
+
...notifications.map((n) => ({ kind: 'notification', data: n })),
|
|
263
|
+
];
|
|
264
|
+
// Sort by createdAt ascending (oldest first = bottom of stack, newest last = top)
|
|
265
|
+
items.sort((a, b) => getItemCreatedAt(a) - getItemCreatedAt(b));
|
|
266
|
+
return items;
|
|
267
|
+
}, [toasts, notifications]);
|
|
268
|
+
const visibleItems = useMemo(() => allItems.filter((item) => !isItemExiting(item)), [allItems]);
|
|
269
|
+
const hasNotifications = notifications.some((n) => !n.isExiting);
|
|
270
|
+
const canCollapse = !hasNotifications;
|
|
271
|
+
const { heights, settledIds, positions, lastPositionsRef, itemRefs, createRefCallback, } = useItemPositions(visibleItems);
|
|
272
|
+
const { isCollapsed, handleMouseEnter, handleMouseLeave, handleFocus, handleBlur, containerRef, } = useCollapseState(canCollapse, allItems, itemRefs, onPauseChange);
|
|
273
|
+
// ─── Callbacks ─────────────────────────────────────────────────────
|
|
274
|
+
const handleExitComplete = useEvent((item) => {
|
|
275
|
+
const id = getItemId(item);
|
|
276
|
+
lastPositionsRef.current?.delete(id);
|
|
277
|
+
if (item.kind === 'toast') {
|
|
278
|
+
onToastExitComplete(item.data.internalId);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
onNotificationExitComplete(item.data.internalId);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
// useCallback (not useEvent) because this is called during render.
|
|
285
|
+
// useEvent defers the ref update to useLayoutEffect, so during render
|
|
286
|
+
// it would still read the previous closure's positions/heights.
|
|
287
|
+
const getItemStyle = useCallback((item, index, total) => {
|
|
288
|
+
const id = getItemId(item);
|
|
289
|
+
const baseTop = positions.get(id) ?? lastPositionsRef.current?.get(id) ?? 0;
|
|
290
|
+
const height = heights[id] ?? DEFAULT_ITEM_HEIGHT;
|
|
291
|
+
if (!isCollapsed || !canCollapse) {
|
|
292
|
+
return { top: `${baseTop}px` };
|
|
293
|
+
}
|
|
294
|
+
const isNewest = index === total - 1;
|
|
295
|
+
const collapsedTop = COLLAPSE_VISIBLE_HEIGHT - CONTAINER_OFFSET - height;
|
|
296
|
+
return {
|
|
297
|
+
top: `${collapsedTop}px`,
|
|
298
|
+
zIndex: index,
|
|
299
|
+
opacity: isNewest ? 1 : 0,
|
|
300
|
+
pointerEvents: 'none',
|
|
301
|
+
};
|
|
302
|
+
}, [isCollapsed, canCollapse, positions, heights, lastPositionsRef]);
|
|
303
|
+
// Build a visibleIndex lookup map to avoid O(n²) findIndex inside render loop
|
|
304
|
+
const visibleIndexMap = useMemo(() => {
|
|
305
|
+
const map = new Map();
|
|
306
|
+
visibleItems.forEach((item, index) => {
|
|
307
|
+
map.set(getItemId(item), index);
|
|
308
|
+
});
|
|
309
|
+
return map;
|
|
310
|
+
}, [visibleItems]);
|
|
311
|
+
if (allItems.length === 0)
|
|
312
|
+
return null;
|
|
313
|
+
return (_jsx(Portal, { children: _jsx(OverlayContainerElement, { ref: containerRef, onFocus: handleFocus, onBlur: handleBlur, children: allItems.map((item) => {
|
|
314
|
+
const itemId = getItemId(item);
|
|
315
|
+
const visibleIndex = visibleIndexMap.get(itemId) ?? 0;
|
|
316
|
+
const isExiting = isItemExiting(item);
|
|
317
|
+
return (_jsx(DisplayTransition, { animateOnMount: true, isShown: !isExiting, onRest: (transition) => {
|
|
318
|
+
if (transition === 'exit') {
|
|
319
|
+
handleExitComplete(item);
|
|
320
|
+
}
|
|
321
|
+
}, children: ({ isShown, ref }) => (_jsx(OverlayItemWrapper, { ref: createRefCallback(itemId, ref), mods: { isShown, isMeasured: settledIds.has(itemId) }, style: getItemStyle(item, visibleIndex, visibleItems.length), onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: item.kind === 'toast' ? (_jsx(ToastItem, { ...item.data.itemProps, title: item.data.title, description: item.data.description, theme: item.data.theme, icon: item.data.icon, isLoading: item.data.isLoading })) : (_jsx(NotificationItem, { notification: item.data, onDismiss: onNotificationDismiss })) })) }, itemId));
|
|
322
|
+
}) }) }));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|