@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.
Files changed (689) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/es/_internal/hooks/index.js +1 -1
  3. package/es/_internal/hooks/use-chained-callback.js +1 -1
  4. package/es/_internal/hooks/use-debounced-value.js +1 -1
  5. package/es/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/es/_internal/hooks/use-effect-once.js +1 -1
  7. package/es/_internal/hooks/use-event.js +1 -1
  8. package/es/_internal/hooks/use-is-first-render.js +1 -1
  9. package/es/_internal/hooks/use-sync-ref.js +1 -1
  10. package/es/_internal/hooks/use-timer/index.js +1 -1
  11. package/es/_internal/hooks/use-timer/timer.js +1 -1
  12. package/es/_internal/hooks/use-timer/use-timer.js +1 -1
  13. package/es/_internal/hooks/use-update-effect.js +1 -1
  14. package/es/_internal/hooks/use-warn.js +1 -1
  15. package/es/_internal/index.js +1 -1
  16. package/es/components/Block.js +1 -1
  17. package/es/components/CollectionItem.js +1 -1
  18. package/es/components/GlobalStyles.js +1 -1
  19. package/es/components/GridProvider.js +1 -1
  20. package/es/components/HiddenInput.js +1 -1
  21. package/es/components/OpenTrasition.js +1 -1
  22. package/es/components/Root.js +3 -4
  23. package/es/components/actions/Action/Action.js +1 -1
  24. package/es/components/actions/Banner/Banner.js +1 -1
  25. package/es/components/actions/Banner/index.js +1 -1
  26. package/es/components/actions/Button/Button.js +1 -1
  27. package/es/components/actions/Button/index.js +1 -1
  28. package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  29. package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
  30. package/es/components/actions/CommandMenu/index.js +1 -1
  31. package/es/components/actions/CommandMenu/styled.js +1 -1
  32. package/es/components/actions/ItemAction/ItemAction.js +5 -1
  33. package/es/components/actions/ItemAction/index.js +1 -1
  34. package/es/components/actions/ItemActionContext.js +1 -1
  35. package/es/components/actions/ItemButton/ItemButton.js +1 -1
  36. package/es/components/actions/ItemButton/index.js +1 -1
  37. package/es/components/actions/Link/Link.js +1 -1
  38. package/es/components/actions/Menu/Menu.js +1 -1
  39. package/es/components/actions/Menu/MenuItem.js +1 -1
  40. package/es/components/actions/Menu/MenuSection.js +1 -1
  41. package/es/components/actions/Menu/MenuTrigger.js +1 -1
  42. package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
  43. package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  44. package/es/components/actions/Menu/context.js +1 -1
  45. package/es/components/actions/Menu/index.js +1 -1
  46. package/es/components/actions/Menu/styled.js +1 -1
  47. package/es/components/actions/index.js +1 -1
  48. package/es/components/actions/use-action.js +1 -1
  49. package/es/components/actions/use-anchored-menu.js +1 -1
  50. package/es/components/actions/use-context-menu.js +1 -1
  51. package/es/components/content/ActiveZone/ActiveZone.js +1 -1
  52. package/es/components/content/Alert/Alert.js +1 -1
  53. package/es/components/content/Alert/index.js +1 -1
  54. package/es/components/content/Alert/types.js +1 -1
  55. package/es/components/content/Alert/use-alert.js +1 -1
  56. package/es/components/content/Avatar/Avatar.js +1 -1
  57. package/es/components/content/Badge/Badge.js +1 -1
  58. package/es/components/content/Card/Card.js +1 -1
  59. package/es/components/content/Content.js +1 -1
  60. package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  61. package/es/components/content/CopyPasteBlock/index.js +1 -1
  62. package/es/components/content/CopySnippet/CopySnippet.js +1 -1
  63. package/es/components/content/CopySnippet/index.js +1 -1
  64. package/es/components/content/Disclosure/Disclosure.js +1 -1
  65. package/es/components/content/Disclosure/index.js +1 -1
  66. package/es/components/content/Divider.js +1 -1
  67. package/es/components/content/Footer.js +1 -1
  68. package/es/components/content/Header.js +1 -1
  69. package/es/components/content/HotKeys/HotKeys.js +1 -1
  70. package/es/components/content/HotKeys/index.js +1 -1
  71. package/es/components/content/Item/Item.js +1 -1
  72. package/es/components/content/Item/index.js +1 -1
  73. package/es/components/content/ItemBadge/ItemBadge.js +1 -1
  74. package/es/components/content/ItemBadge/index.js +1 -1
  75. package/es/components/content/Layout/GridLayout.js +1 -1
  76. package/es/components/content/Layout/Layout.js +1 -1
  77. package/es/components/content/Layout/LayoutBlock.js +1 -1
  78. package/es/components/content/Layout/LayoutCenter.js +1 -1
  79. package/es/components/content/Layout/LayoutContainer.js +2 -1
  80. package/es/components/content/Layout/LayoutContent.js +1 -1
  81. package/es/components/content/Layout/LayoutContext.js +1 -1
  82. package/es/components/content/Layout/LayoutFlex.js +1 -1
  83. package/es/components/content/Layout/LayoutFooter.js +1 -1
  84. package/es/components/content/Layout/LayoutGrid.js +1 -1
  85. package/es/components/content/Layout/LayoutHeader.js +1 -1
  86. package/es/components/content/Layout/LayoutPane.js +1 -1
  87. package/es/components/content/Layout/LayoutPanel.js +1 -1
  88. package/es/components/content/Layout/LayoutPanelHeader.js +1 -1
  89. package/es/components/content/Layout/LayoutToolbar.js +1 -1
  90. package/es/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  91. package/es/components/content/Layout/index.js +1 -1
  92. package/es/components/content/Layout/utils.js +1 -1
  93. package/es/components/content/List/SectionHeading.js +1 -1
  94. package/es/components/content/List/index.js +1 -1
  95. package/es/components/content/Paragraph.js +1 -1
  96. package/es/components/content/Placeholder/Placeholder.js +1 -1
  97. package/es/components/content/PrismCode/PrismCode.js +1 -1
  98. package/es/components/content/PrismCode/prismSetup.js +1 -1
  99. package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  100. package/es/components/content/Result/Result.js +1 -1
  101. package/es/components/content/Skeleton/Skeleton.js +1 -1
  102. package/es/components/content/Tag/Tag.js +1 -1
  103. package/es/components/content/Text.js +1 -1
  104. package/es/components/content/TextItem/TextItem.js +1 -1
  105. package/es/components/content/TextItem/index.js +1 -1
  106. package/es/components/content/Title.js +1 -1
  107. package/es/components/content/highlightText.js +1 -1
  108. package/es/components/content/use-auto-tooltip.js +1 -1
  109. package/es/components/fields/Checkbox/Checkbox.js +1 -1
  110. package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
  111. package/es/components/fields/Checkbox/context.js +1 -1
  112. package/es/components/fields/Checkbox/index.js +1 -1
  113. package/es/components/fields/ComboBox/ComboBox.js +1 -1
  114. package/es/components/fields/ComboBox/index.js +1 -1
  115. package/es/components/fields/DatePicker/DateInput.js +1 -1
  116. package/es/components/fields/DatePicker/DateInputBase.js +1 -1
  117. package/es/components/fields/DatePicker/DatePicker.js +1 -1
  118. package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
  119. package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
  120. package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
  121. package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
  122. package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
  123. package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  124. package/es/components/fields/DatePicker/TimeInput.js +1 -1
  125. package/es/components/fields/DatePicker/index.js +1 -1
  126. package/es/components/fields/DatePicker/intl.js +1 -1
  127. package/es/components/fields/DatePicker/parseDate.js +1 -1
  128. package/es/components/fields/DatePicker/props.js +1 -1
  129. package/es/components/fields/DatePicker/types.js +1 -1
  130. package/es/components/fields/DatePicker/utils.js +1 -1
  131. package/es/components/fields/FileInput/FileInput.js +1 -1
  132. package/es/components/fields/FilterListBox/FilterListBox.js +1 -1
  133. package/es/components/fields/FilterListBox/index.js +1 -1
  134. package/es/components/fields/FilterPicker/FilterPicker.js +1 -1
  135. package/es/components/fields/FilterPicker/index.js +1 -1
  136. package/es/components/fields/Input/Input.js +1 -1
  137. package/es/components/fields/Input/index.js +1 -1
  138. package/es/components/fields/ListBox/ListBox.js +1 -1
  139. package/es/components/fields/ListBox/index.js +1 -1
  140. package/es/components/fields/NumberInput/NumberInput.js +1 -1
  141. package/es/components/fields/NumberInput/StepButton.js +1 -1
  142. package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
  143. package/es/components/fields/Picker/Picker.js +1 -1
  144. package/es/components/fields/Picker/index.js +1 -1
  145. package/es/components/fields/RadioGroup/Radio.js +1 -1
  146. package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
  147. package/es/components/fields/RadioGroup/context.js +1 -1
  148. package/es/components/fields/RadioGroup/index.js +1 -1
  149. package/es/components/fields/SearchInput/SearchInput.js +1 -1
  150. package/es/components/fields/SearchInput/index.js +1 -1
  151. package/es/components/fields/Select/Select.js +1 -1
  152. package/es/components/fields/Select/index.js +1 -1
  153. package/es/components/fields/Slider/Gradation.js +1 -1
  154. package/es/components/fields/Slider/Header.js +1 -1
  155. package/es/components/fields/Slider/HueSlider.js +1 -1
  156. package/es/components/fields/Slider/RangeSlider.js +1 -1
  157. package/es/components/fields/Slider/Slider.js +1 -1
  158. package/es/components/fields/Slider/SliderBase.js +1 -1
  159. package/es/components/fields/Slider/SliderInput.js +1 -1
  160. package/es/components/fields/Slider/SliderThumb.js +1 -1
  161. package/es/components/fields/Slider/SliderTrack.js +1 -1
  162. package/es/components/fields/Slider/elements.js +1 -1
  163. package/es/components/fields/Slider/index.js +1 -1
  164. package/es/components/fields/Slider/types.js +1 -1
  165. package/es/components/fields/Switch/Switch.js +1 -1
  166. package/es/components/fields/Switch/index.js +1 -1
  167. package/es/components/fields/TextArea/TextArea.js +1 -1
  168. package/es/components/fields/TextArea/index.js +1 -1
  169. package/es/components/fields/TextInput/TextInput.js +1 -1
  170. package/es/components/fields/TextInput/TextInputBase.js +1 -1
  171. package/es/components/fields/TextInput/index.js +1 -1
  172. package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  173. package/es/components/fields/TextInputMapper/index.js +1 -1
  174. package/es/components/fields/index.js +1 -1
  175. package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
  176. package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  177. package/es/components/form/FieldWrapper/index.js +1 -1
  178. package/es/components/form/FieldWrapper/types.js +1 -1
  179. package/es/components/form/Form/Field.js +1 -1
  180. package/es/components/form/Form/Form.js +1 -1
  181. package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
  182. package/es/components/form/Form/ResetButton/index.js +1 -1
  183. package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  184. package/es/components/form/Form/SubmitButton/index.js +1 -1
  185. package/es/components/form/Form/SubmitError.js +1 -1
  186. package/es/components/form/Form/index.js +1 -1
  187. package/es/components/form/Form/types.js +1 -1
  188. package/es/components/form/Form/use-field/index.js +1 -1
  189. package/es/components/form/Form/use-field/types.js +1 -1
  190. package/es/components/form/Form/use-field/use-field-props.js +1 -1
  191. package/es/components/form/Form/use-field/use-field.js +1 -1
  192. package/es/components/form/Form/use-form.js +1 -1
  193. package/es/components/form/Form/validation.js +1 -1
  194. package/es/components/form/Label.js +1 -1
  195. package/es/components/form/index.js +1 -1
  196. package/es/components/form/wrapper.js +1 -1
  197. package/es/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  198. package/es/components/helpers/DisplayTransition/index.js +1 -1
  199. package/es/components/helpers/IconSwitch/IconSwitch.js +1 -1
  200. package/es/components/helpers/index.js +1 -1
  201. package/es/components/layout/Flex.js +1 -1
  202. package/es/components/layout/Flow.js +1 -1
  203. package/es/components/layout/Grid.js +1 -1
  204. package/es/components/layout/Panel.js +1 -1
  205. package/es/components/layout/Prefix.js +1 -1
  206. package/es/components/layout/ResizablePanel.js +1 -1
  207. package/es/components/layout/Space.js +1 -1
  208. package/es/components/layout/Suffix.js +1 -1
  209. package/es/components/navigation/Tabs/DraggableTabList.js +1 -1
  210. package/es/components/navigation/Tabs/EditableTitle.js +1 -1
  211. package/es/components/navigation/Tabs/TabButton.js +1 -1
  212. package/es/components/navigation/Tabs/TabDropIndicator.js +1 -1
  213. package/es/components/navigation/Tabs/TabPanel.js +1 -1
  214. package/es/components/navigation/Tabs/TabPicker.js +1 -1
  215. package/es/components/navigation/Tabs/Tabs.js +1 -1
  216. package/es/components/navigation/Tabs/TabsAction.js +1 -1
  217. package/es/components/navigation/Tabs/TabsContext.js +1 -1
  218. package/es/components/navigation/Tabs/index.js +1 -1
  219. package/es/components/navigation/Tabs/styled.js +1 -1
  220. package/es/components/navigation/Tabs/types.js +1 -1
  221. package/es/components/navigation/Tabs/use-tab-editing.js +1 -1
  222. package/es/components/navigation/Tabs/use-tab-indicator.js +1 -1
  223. package/es/components/navigation/index.js +1 -1
  224. package/es/components/organisms/FileTabs/FileTabs.js +1 -1
  225. package/es/components/organisms/StatsCard/StatsCard.js +1 -1
  226. package/es/components/other/Calendar/Calendar.js +1 -1
  227. package/es/components/other/Calendar/CalendarCell.js +1 -1
  228. package/es/components/other/Calendar/CalendarGrid.js +1 -1
  229. package/es/components/other/Calendar/RangeCalendar.js +1 -1
  230. package/es/components/other/CloudLogo/CloudLogo.js +1 -1
  231. package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
  232. package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  233. package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  234. package/es/components/overlays/AlertDialog/index.js +1 -1
  235. package/es/components/overlays/AlertDialog/types.js +1 -1
  236. package/es/components/overlays/Dialog/Dialog.js +1 -1
  237. package/es/components/overlays/Dialog/DialogContainer.js +1 -1
  238. package/es/components/overlays/Dialog/DialogForm.js +1 -1
  239. package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
  240. package/es/components/overlays/Dialog/context.js +1 -1
  241. package/es/components/overlays/Dialog/index.js +1 -1
  242. package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
  243. package/es/components/overlays/Modal/Modal.js +1 -1
  244. package/es/components/overlays/Modal/OpenTransition.js +1 -1
  245. package/es/components/overlays/Modal/Overlay.js +1 -1
  246. package/es/components/overlays/Modal/Popover.js +1 -1
  247. package/es/components/overlays/Modal/Tray.js +1 -1
  248. package/es/components/overlays/Modal/Underlay.js +1 -1
  249. package/es/components/overlays/Modal/index.js +1 -1
  250. package/es/components/overlays/Modal/types.js +1 -1
  251. package/es/components/overlays/Notifications/Notification.js +89 -0
  252. package/es/components/overlays/Notifications/NotificationAction.js +63 -0
  253. package/es/components/overlays/Notifications/NotificationCard.js +76 -0
  254. package/es/components/overlays/Notifications/NotificationContext.js +44 -0
  255. package/es/components/overlays/Notifications/NotificationItem.js +63 -0
  256. package/es/components/overlays/Notifications/OverlayContainer.js +325 -0
  257. package/es/components/overlays/Notifications/OverlayProvider.js +69 -0
  258. package/es/components/overlays/Notifications/PersistentNotificationsList.js +104 -0
  259. package/es/components/overlays/Notifications/format-relative-time.js +55 -0
  260. package/es/components/overlays/Notifications/index.js +51 -0
  261. package/es/components/overlays/{NewNotifications/NotificationsList → Notifications}/types.js +1 -1
  262. package/es/components/overlays/Notifications/use-notification-state.js +205 -0
  263. package/es/components/overlays/Notifications/use-notifications.js +175 -0
  264. package/es/components/overlays/Notifications/use-overlay-timers.js +138 -0
  265. package/es/components/overlays/Notifications/use-persistent-notifications.js +63 -0
  266. package/es/components/overlays/Notifications/use-persistent-state.js +66 -0
  267. package/es/components/overlays/Notifications/use-toast-state.js +143 -0
  268. package/es/components/overlays/OverlayWrapper.js +1 -1
  269. package/es/components/overlays/Toast/ToastItem.js +5 -3
  270. package/es/components/overlays/Toast/ToastProvider.js +6 -352
  271. package/es/components/overlays/Toast/index.js +3 -8
  272. package/es/components/overlays/Toast/types.js +1 -1
  273. package/es/components/overlays/Toast/useProgressToast.js +2 -5
  274. package/es/components/overlays/Toast/useToast.js +1 -7
  275. package/es/components/overlays/Tooltip/Tooltip.js +1 -1
  276. package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
  277. package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  278. package/es/components/overlays/Tooltip/context.js +1 -1
  279. package/es/components/overlays/Tooltip/index.js +1 -1
  280. package/es/components/portal/Portal.js +1 -1
  281. package/es/components/portal/PortalProvider.js +1 -1
  282. package/es/components/portal/index.js +1 -1
  283. package/es/components/portal/types.js +1 -1
  284. package/es/components/portal/usePortal.js +1 -1
  285. package/es/components/shared/InvalidIcon.js +1 -1
  286. package/es/components/shared/ValidIcon.js +1 -1
  287. package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  288. package/es/components/status/LoadingAnimation/index.js +1 -1
  289. package/es/components/status/Spin/Cube.js +1 -1
  290. package/es/components/status/Spin/InternalSpinner.js +1 -1
  291. package/es/components/status/Spin/Spin.js +1 -1
  292. package/es/components/status/Spin/SpinsContainer.js +1 -1
  293. package/es/components/status/Spin/index.js +1 -1
  294. package/es/components/status/Spin/types.js +1 -1
  295. package/es/components/status/index.js +1 -1
  296. package/es/data/item-themes.js +1 -1
  297. package/es/data/themes.js +1 -1
  298. package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
  299. package/es/icons/AdjustmentsIcon.js +1 -1
  300. package/es/icons/AiIcon.js +1 -1
  301. package/es/icons/AreaChartIcon.js +1 -1
  302. package/es/icons/BackwardIcon.js +1 -1
  303. package/es/icons/BarChartIcon.js +1 -1
  304. package/es/icons/BellFilledIcon.js +1 -1
  305. package/es/icons/BellIcon.js +1 -1
  306. package/es/icons/BooleanIcon.js +1 -1
  307. package/es/icons/CalendarEditIcon.js +1 -1
  308. package/es/icons/CalendarIcon.js +1 -1
  309. package/es/icons/CaretDownIcon.js +1 -1
  310. package/es/icons/CaretUpIcon.js +1 -1
  311. package/es/icons/ChartAreaStackedIcon.js +1 -1
  312. package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
  313. package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  314. package/es/icons/ChartBarGroupedIcon.js +1 -1
  315. package/es/icons/ChartBarHorizontalIcon.js +1 -1
  316. package/es/icons/ChartBarLineIcon.js +1 -1
  317. package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
  318. package/es/icons/ChartBarStackedIcon.js +1 -1
  319. package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  320. package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
  321. package/es/icons/ChartBoxPlot2Icon.js +1 -1
  322. package/es/icons/ChartBoxPlotIcon.js +1 -1
  323. package/es/icons/ChartBubbleIcon.js +1 -1
  324. package/es/icons/ChartDonut2Icon.js +1 -1
  325. package/es/icons/ChartFunnelIcon.js +1 -1
  326. package/es/icons/ChartHeatmapIcon.js +1 -1
  327. package/es/icons/ChartKPIIcon.js +1 -1
  328. package/es/icons/ChartPie2Icon.js +1 -1
  329. package/es/icons/ChartScatterIcon.js +1 -1
  330. package/es/icons/CheckCircleFilledIcon.js +1 -1
  331. package/es/icons/CheckCircleIcon.js +1 -1
  332. package/es/icons/CheckIcon.js +1 -1
  333. package/es/icons/CircleFilledIcon.js +1 -1
  334. package/es/icons/ClearIcon.js +1 -1
  335. package/es/icons/CloseCircleFilledIcon.js +1 -1
  336. package/es/icons/CloseCircleIcon.js +1 -1
  337. package/es/icons/CloseIcon.js +1 -1
  338. package/es/icons/CodeIcon.js +1 -1
  339. package/es/icons/ColumnTotalIcon.js +1 -1
  340. package/es/icons/CopyIcon.js +1 -1
  341. package/es/icons/CountIcon.js +1 -1
  342. package/es/icons/CubeIcon.js +1 -1
  343. package/es/icons/CubePauseIcon.js +1 -1
  344. package/es/icons/CubePlayIcon.js +1 -1
  345. package/es/icons/CurrencyDollarIcon.js +1 -1
  346. package/es/icons/DangerIcon.js +1 -1
  347. package/es/icons/DashboardIcon.js +1 -1
  348. package/es/icons/DatabaseIcon.js +1 -1
  349. package/es/icons/DecimalDecreaseIcon.js +1 -1
  350. package/es/icons/DecimalIncreaseIcon.js +1 -1
  351. package/es/icons/DirectionIcon.js +1 -1
  352. package/es/icons/DonutIcon.js +1 -1
  353. package/es/icons/DownIcon.js +1 -1
  354. package/es/icons/EditIcon.js +1 -1
  355. package/es/icons/ExclamationCircleFilledIcon.js +1 -1
  356. package/es/icons/ExclamationCircleIcon.js +1 -1
  357. package/es/icons/ExclamationIcon.js +1 -1
  358. package/es/icons/EyeIcon.js +1 -1
  359. package/es/icons/EyeInvisibleIcon.js +1 -1
  360. package/es/icons/FilterIcon.js +1 -1
  361. package/es/icons/FolderFilledIcon.js +1 -1
  362. package/es/icons/FolderIcon.js +1 -1
  363. package/es/icons/FolderOpenFilledIcon.js +1 -1
  364. package/es/icons/FolderOpenIcon.js +1 -1
  365. package/es/icons/ForwardIcon.js +1 -1
  366. package/es/icons/HierarchyIcon.js +1 -1
  367. package/es/icons/HierarchyOpenIcon.js +1 -1
  368. package/es/icons/Icon.js +1 -1
  369. package/es/icons/InfoCircleIcon.js +1 -1
  370. package/es/icons/InfoIcon.js +1 -1
  371. package/es/icons/KeyIcon.js +1 -1
  372. package/es/icons/LeftIcon.js +1 -1
  373. package/es/icons/LineChartIcon.js +1 -1
  374. package/es/icons/LoadingIcon.js +1 -1
  375. package/es/icons/LockFilledIcon.js +1 -1
  376. package/es/icons/LockIcon.js +1 -1
  377. package/es/icons/MoreIcon.js +1 -1
  378. package/es/icons/NotAllowedIcon.js +1 -1
  379. package/es/icons/Number123Icon.js +1 -1
  380. package/es/icons/NumberIcon.js +1 -1
  381. package/es/icons/PauseCircleFilledIcon.js +1 -1
  382. package/es/icons/PauseCircleIcon.js +1 -1
  383. package/es/icons/PauseIcon.js +1 -1
  384. package/es/icons/PercentageIcon.js +1 -1
  385. package/es/icons/PieChartIcon.js +1 -1
  386. package/es/icons/PlayCircleIcon.js +1 -1
  387. package/es/icons/PlayIcon.js +1 -1
  388. package/es/icons/PlusIcon.js +1 -1
  389. package/es/icons/ProgressBarIcon.js +1 -1
  390. package/es/icons/ReloadIcon.js +1 -1
  391. package/es/icons/ReportIcon.js +1 -1
  392. package/es/icons/ReturnIcon.js +1 -1
  393. package/es/icons/RightIcon.js +1 -1
  394. package/es/icons/RowTotalsIcon.js +1 -1
  395. package/es/icons/SchemeIcon.js +1 -1
  396. package/es/icons/SearchIcon.js +1 -1
  397. package/es/icons/SemanticQueryIcon.js +1 -1
  398. package/es/icons/SettingsIcon.js +1 -1
  399. package/es/icons/ShieldFilledIcon.js +1 -1
  400. package/es/icons/ShieldIcon.js +1 -1
  401. package/es/icons/SlashIcon.js +1 -1
  402. package/es/icons/SparklesIcon.js +1 -1
  403. package/es/icons/SqlIcon.js +1 -1
  404. package/es/icons/StatsIcon.js +1 -1
  405. package/es/icons/StopIcon.js +1 -1
  406. package/es/icons/StringIcon.js +1 -1
  407. package/es/icons/SubtotalsIcon.js +1 -1
  408. package/es/icons/SwitchIcon.js +1 -1
  409. package/es/icons/TableIcon.js +1 -1
  410. package/es/icons/ThumbsDownIcon.js +1 -1
  411. package/es/icons/ThumbsUpIcon.js +1 -1
  412. package/es/icons/ThunderboltCrossedIcon.js +1 -1
  413. package/es/icons/ThunderboltFilledIcon.js +1 -1
  414. package/es/icons/ThunderboltIcon.js +1 -1
  415. package/es/icons/TimeIcon.js +1 -1
  416. package/es/icons/TrashIcon.js +1 -1
  417. package/es/icons/UnlockIcon.js +1 -1
  418. package/es/icons/UpIcon.js +1 -1
  419. package/es/icons/UserGroupIcon.js +1 -1
  420. package/es/icons/UserIcon.js +1 -1
  421. package/es/icons/UserLockIcon.js +1 -1
  422. package/es/icons/ViewIcon.js +1 -1
  423. package/es/icons/WarningFilledIcon.js +1 -1
  424. package/es/icons/WarningIcon.js +1 -1
  425. package/es/icons/index.js +1 -1
  426. package/es/icons/wrap-icon.js +1 -1
  427. package/es/index.js +2 -4
  428. package/es/provider.js +1 -1
  429. package/es/providers/TrackingProvider.js +1 -1
  430. package/es/providers/navigation.types.js +1 -1
  431. package/es/providers/navigationAdapter.default.js +1 -1
  432. package/es/shared/form.js +1 -1
  433. package/es/shared/index.js +1 -1
  434. package/es/stories/Form.legacy-stories.js +1 -1
  435. package/es/stories/FormFieldArgs.js +1 -1
  436. package/es/stories/SimpleLayout.stories.js +1 -1
  437. package/es/stories/Tasty.stories.js +1 -1
  438. package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
  439. package/es/stories/components/DialogFormApp.js +1 -1
  440. package/es/stories/components/StyledButton.js +1 -1
  441. package/es/stories/lists/baseProps.js +1 -1
  442. package/es/stories/playground/PlaygroundEditor.js +1 -1
  443. package/es/stories/playground/PlaygroundLayout.js +1 -1
  444. package/es/stories/playground/PlaygroundOutput.js +1 -1
  445. package/es/stories/playground/PlaygroundPreview.js +1 -1
  446. package/es/stories/playground/components/Button.js +1 -1
  447. package/es/stories/playground/components/Card.js +1 -1
  448. package/es/stories/playground/components/ScrollProgress.js +1 -1
  449. package/es/stories/playground/examples.js +1 -1
  450. package/es/tasty/chunks/cacheKey.js +1 -1
  451. package/es/tasty/chunks/definitions.js +1 -1
  452. package/es/tasty/chunks/index.js +1 -1
  453. package/es/tasty/chunks/renderChunk.js +1 -1
  454. package/es/tasty/config.js +1 -1
  455. package/es/tasty/debug.js +1 -1
  456. package/es/tasty/hooks/index.js +1 -1
  457. package/es/tasty/hooks/useGlobalStyles.js +1 -1
  458. package/es/tasty/hooks/useKeyframes.js +1 -1
  459. package/es/tasty/hooks/useProperty.js +1 -1
  460. package/es/tasty/hooks/useRawCSS.js +1 -1
  461. package/es/tasty/hooks/useStyles.js +1 -1
  462. package/es/tasty/index.js +1 -6
  463. package/es/tasty/injector/index.js +1 -1
  464. package/es/tasty/injector/injector.js +1 -1
  465. package/es/tasty/injector/sheet-manager.js +1 -1
  466. package/es/tasty/injector/types.js +1 -1
  467. package/es/tasty/keyframes/index.js +1 -1
  468. package/es/tasty/parser/classify.js +1 -1
  469. package/es/tasty/parser/const.js +1 -1
  470. package/es/tasty/parser/lru.js +1 -1
  471. package/es/tasty/parser/parser.js +1 -1
  472. package/es/tasty/parser/tokenizer.js +1 -1
  473. package/es/tasty/parser/types.js +1 -1
  474. package/es/tasty/pipeline/conditions.js +1 -1
  475. package/es/tasty/pipeline/exclusive.js +1 -1
  476. package/es/tasty/pipeline/index.js +1 -1
  477. package/es/tasty/pipeline/materialize.js +1 -1
  478. package/es/tasty/pipeline/parseStateKey.js +1 -1
  479. package/es/tasty/pipeline/simplify.js +1 -1
  480. package/es/tasty/plugins/index.js +1 -1
  481. package/es/tasty/plugins/okhsl-plugin.js +1 -1
  482. package/es/tasty/plugins/types.js +1 -1
  483. package/es/tasty/properties/index.js +1 -1
  484. package/es/tasty/states/index.js +1 -1
  485. package/es/tasty/static/index.js +1 -1
  486. package/es/tasty/static/tastyStatic.js +1 -1
  487. package/es/tasty/static/types.js +1 -1
  488. package/es/tasty/styles/align.js +1 -1
  489. package/es/tasty/styles/border.js +1 -1
  490. package/es/tasty/styles/boxShadow.combinator.js +1 -1
  491. package/es/tasty/styles/color.js +1 -1
  492. package/es/tasty/styles/createStyle.js +1 -1
  493. package/es/tasty/styles/dimension.js +1 -1
  494. package/es/tasty/styles/display.js +1 -1
  495. package/es/tasty/styles/fade.js +1 -1
  496. package/es/tasty/styles/fill.js +1 -1
  497. package/es/tasty/styles/flow.js +1 -1
  498. package/es/tasty/styles/gap.js +1 -1
  499. package/es/tasty/styles/height.js +1 -1
  500. package/es/tasty/styles/index.js +1 -1
  501. package/es/tasty/styles/inset.js +1 -1
  502. package/es/tasty/styles/justify.js +1 -1
  503. package/es/tasty/styles/list.js +1 -1
  504. package/es/tasty/styles/margin.js +1 -1
  505. package/es/tasty/styles/outline.js +1 -1
  506. package/es/tasty/styles/padding.js +1 -1
  507. package/es/tasty/styles/place.js +1 -1
  508. package/es/tasty/styles/predefined.js +1 -1
  509. package/es/tasty/styles/preset.js +1 -1
  510. package/es/tasty/styles/radius.js +1 -1
  511. package/es/tasty/styles/reset.js +1 -1
  512. package/es/tasty/styles/scrollbar.js +1 -1
  513. package/es/tasty/styles/shadow.js +1 -1
  514. package/es/tasty/styles/styledScrollbar.js +1 -1
  515. package/es/tasty/styles/transition.js +1 -1
  516. package/es/tasty/styles/types.js +1 -1
  517. package/es/tasty/styles/width.js +1 -1
  518. package/es/tasty/tasty.js +1 -1
  519. package/es/tasty/types.js +1 -1
  520. package/es/tasty/utils/cache-wrapper.js +1 -1
  521. package/es/tasty/utils/case-converter.js +1 -1
  522. package/es/tasty/utils/colors.js +1 -1
  523. package/es/tasty/utils/dotize.js +1 -1
  524. package/es/tasty/utils/filter-base-props.js +1 -1
  525. package/es/tasty/utils/get-display-name.js +1 -1
  526. package/es/tasty/utils/hsl-to-rgb.js +1 -1
  527. package/es/tasty/utils/is-dev-env.js +1 -1
  528. package/es/tasty/utils/merge-styles.js +1 -1
  529. package/es/tasty/utils/mod-attrs.js +1 -1
  530. package/es/tasty/utils/okhsl-to-rgb.js +1 -1
  531. package/es/tasty/utils/process-tokens.js +1 -1
  532. package/es/tasty/utils/resolve-recipes.js +1 -1
  533. package/es/tasty/utils/rgb-to-okhsl.js +1 -1
  534. package/es/tasty/utils/string.js +1 -1
  535. package/es/tasty/utils/styles.js +9 -2
  536. package/es/tasty/utils/typography.js +1 -1
  537. package/es/tasty/utils/warnings.js +1 -1
  538. package/es/tasty/zero/babel.js +1 -1
  539. package/es/tasty/zero/css-writer.js +1 -1
  540. package/es/tasty/zero/extractor.js +1 -1
  541. package/es/tasty/zero/index.js +1 -1
  542. package/es/tasty/zero/next.js +1 -1
  543. package/es/tokens/base.js +1 -1
  544. package/es/tokens/colors.js +1 -1
  545. package/es/tokens/index.js +1 -1
  546. package/es/tokens/layout.js +1 -1
  547. package/es/tokens/shadows.js +1 -1
  548. package/es/tokens/sizes.js +1 -1
  549. package/es/tokens/spacing.js +1 -1
  550. package/es/tokens/typography.js +1 -1
  551. package/es/utils/ResizeSensor.js +1 -1
  552. package/es/utils/index.js +1 -1
  553. package/es/utils/modules.js +1 -1
  554. package/es/utils/promise.js +1 -1
  555. package/es/utils/raf.js +1 -1
  556. package/es/utils/random.js +1 -1
  557. package/es/utils/range.js +1 -1
  558. package/es/utils/react/RenderCache.js +1 -1
  559. package/es/utils/react/Slots.js +1 -1
  560. package/es/utils/react/chain.js +1 -1
  561. package/es/utils/react/forwardRefWithGenerics.js +1 -1
  562. package/es/utils/react/index.js +1 -1
  563. package/es/utils/react/interactions.js +1 -1
  564. package/es/utils/react/isTextOnly.js +1 -1
  565. package/es/utils/react/mapProps.js +1 -1
  566. package/es/utils/react/mergeProps.js +1 -1
  567. package/es/utils/react/nullableValue.js +1 -1
  568. package/es/utils/react/resolveIcon.js +1 -1
  569. package/es/utils/react/sharedStore.js +1 -1
  570. package/es/utils/react/useCombinedRefs.js +1 -1
  571. package/es/utils/react/useControlledFocusVisible.js +1 -1
  572. package/es/utils/react/useEventBus.js +1 -1
  573. package/es/utils/react/useId.js +1 -1
  574. package/es/utils/react/useIsDarwin.js +1 -1
  575. package/es/utils/react/useKeySymbols.js +1 -1
  576. package/es/utils/react/useLayoutEffect.js +1 -1
  577. package/es/utils/react/useLocalStorage.js +1 -1
  578. package/es/utils/react/useMergeStyles.js +1 -1
  579. package/es/utils/react/useQaProps.js +1 -1
  580. package/es/utils/react/useViewportSize.js +1 -1
  581. package/es/utils/react/wrapNodeIfPlain.js +1 -1
  582. package/es/utils/tree.js +1 -1
  583. package/es/utils/warnings.js +1 -1
  584. package/es/version.js +2 -2
  585. package/package.json +1 -1
  586. package/types/components/HiddenInput.d.ts +56 -56
  587. package/types/components/actions/Button/Button.d.ts +64 -64
  588. package/types/components/actions/CommandMenu/styled.d.ts +280 -280
  589. package/types/components/actions/Menu/styled.d.ts +423 -423
  590. package/types/components/content/List/SectionHeading.d.ts +47 -47
  591. package/types/components/content/Text.d.ts +112 -112
  592. package/types/components/fields/DatePicker/DatePickerElement.d.ts +47 -47
  593. package/types/components/fields/Select/Select.d.ts +56 -56
  594. package/types/components/fields/Slider/elements.d.ts +338 -338
  595. package/types/components/navigation/Tabs/styled.d.ts +446 -446
  596. package/types/components/overlays/Notifications/Notification.d.ts +28 -0
  597. package/types/components/overlays/Notifications/NotificationAction.d.ts +20 -0
  598. package/types/components/overlays/Notifications/NotificationCard.d.ts +35 -0
  599. package/types/components/overlays/Notifications/NotificationContext.d.ts +16 -0
  600. package/types/components/overlays/Notifications/NotificationItem.d.ts +7 -0
  601. package/types/components/overlays/Notifications/OverlayContainer.d.ts +12 -0
  602. package/types/components/overlays/Notifications/OverlayProvider.d.ts +3 -0
  603. package/types/components/overlays/Notifications/PersistentNotificationsList.d.ts +18 -0
  604. package/types/components/overlays/Notifications/format-relative-time.d.ts +14 -0
  605. package/types/components/overlays/Notifications/index.d.ts +40 -0
  606. package/types/components/overlays/Notifications/types.d.ts +145 -0
  607. package/types/components/overlays/Notifications/use-notification-state.d.ts +20 -0
  608. package/types/components/overlays/Notifications/use-notifications.d.ts +36 -0
  609. package/types/components/overlays/Notifications/use-overlay-timers.d.ts +26 -0
  610. package/types/components/overlays/Notifications/use-persistent-notifications.d.ts +48 -0
  611. package/types/components/overlays/Notifications/use-persistent-state.d.ts +11 -0
  612. package/types/components/overlays/Notifications/use-toast-state.d.ts +16 -0
  613. package/types/components/overlays/Toast/ToastItem.d.ts +3 -1
  614. package/types/components/overlays/Toast/ToastProvider.d.ts +5 -8
  615. package/types/components/overlays/Toast/index.d.ts +1 -1
  616. package/types/components/overlays/Toast/types.d.ts +3 -1
  617. package/types/index.d.ts +1 -3
  618. package/types/tasty/tasty.d.ts +56 -56
  619. package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +0 -54
  620. package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +0 -95
  621. package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +0 -56
  622. package/es/components/overlays/NewNotifications/Bar/index.js +0 -10
  623. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +0 -19
  624. package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +0 -38
  625. package/es/components/overlays/NewNotifications/Dialog/index.js +0 -10
  626. package/es/components/overlays/NewNotifications/Notification.js +0 -41
  627. package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +0 -41
  628. package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +0 -25
  629. package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +0 -36
  630. package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +0 -60
  631. package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +0 -31
  632. package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +0 -69
  633. package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +0 -25
  634. package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +0 -86
  635. package/es/components/overlays/NewNotifications/NotificationView/index.js +0 -11
  636. package/es/components/overlays/NewNotifications/NotificationView/types.js +0 -10
  637. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +0 -11
  638. package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +0 -21
  639. package/es/components/overlays/NewNotifications/NotificationsContext/index.js +0 -11
  640. package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +0 -91
  641. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +0 -45
  642. package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +0 -29
  643. package/es/components/overlays/NewNotifications/NotificationsList/index.js +0 -10
  644. package/es/components/overlays/NewNotifications/hooks/index.js +0 -14
  645. package/es/components/overlays/NewNotifications/hooks/types.js +0 -10
  646. package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +0 -15
  647. package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +0 -17
  648. package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +0 -29
  649. package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +0 -17
  650. package/es/components/overlays/NewNotifications/index.js +0 -15
  651. package/es/components/overlays/NewNotifications/types.js +0 -10
  652. package/es/components/overlays/Notification/Notification.js +0 -80
  653. package/es/services/notification.js +0 -71
  654. package/types/components/overlays/NewNotifications/Bar/FloatingNotification.d.ts +0 -15
  655. package/types/components/overlays/NewNotifications/Bar/NotificationsBar.d.ts +0 -21
  656. package/types/components/overlays/NewNotifications/Bar/TransitionComponent.d.ts +0 -4
  657. package/types/components/overlays/NewNotifications/Bar/index.d.ts +0 -1
  658. package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.d.ts +0 -9
  659. package/types/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.d.ts +0 -11
  660. package/types/components/overlays/NewNotifications/Dialog/index.d.ts +0 -1
  661. package/types/components/overlays/NewNotifications/Notification.d.ts +0 -18
  662. package/types/components/overlays/NewNotifications/NotificationView/NotificationAction.d.ts +0 -13
  663. package/types/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.d.ts +0 -4
  664. package/types/components/overlays/NewNotifications/NotificationView/NotificationDescription.d.ts +0 -9
  665. package/types/components/overlays/NewNotifications/NotificationView/NotificationFooter.d.ts +0 -13
  666. package/types/components/overlays/NewNotifications/NotificationView/NotificationHeader.d.ts +0 -9
  667. package/types/components/overlays/NewNotifications/NotificationView/NotificationIcon.d.ts +0 -9
  668. package/types/components/overlays/NewNotifications/NotificationView/NotificationProvider.d.ts +0 -10
  669. package/types/components/overlays/NewNotifications/NotificationView/NotificationView.d.ts +0 -10
  670. package/types/components/overlays/NewNotifications/NotificationView/index.d.ts +0 -2
  671. package/types/components/overlays/NewNotifications/NotificationView/types.d.ts +0 -16
  672. package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.d.ts +0 -5
  673. package/types/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.d.ts +0 -4
  674. package/types/components/overlays/NewNotifications/NotificationsContext/index.d.ts +0 -2
  675. package/types/components/overlays/NewNotifications/NotificationsContext/use-notifications.d.ts +0 -8
  676. package/types/components/overlays/NewNotifications/NotificationsList/NotificationsList.d.ts +0 -21
  677. package/types/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.d.ts +0 -5
  678. package/types/components/overlays/NewNotifications/NotificationsList/index.d.ts +0 -2
  679. package/types/components/overlays/NewNotifications/NotificationsList/types.d.ts +0 -22
  680. package/types/components/overlays/NewNotifications/hooks/index.d.ts +0 -5
  681. package/types/components/overlays/NewNotifications/hooks/types.d.ts +0 -10
  682. package/types/components/overlays/NewNotifications/hooks/use-notification-list-item.d.ts +0 -9
  683. package/types/components/overlays/NewNotifications/hooks/use-notifications-api.d.ts +0 -1
  684. package/types/components/overlays/NewNotifications/hooks/use-notifications-list.d.ts +0 -12
  685. package/types/components/overlays/NewNotifications/hooks/use-notifications-observer.d.ts +0 -2
  686. package/types/components/overlays/NewNotifications/index.d.ts +0 -8
  687. package/types/components/overlays/NewNotifications/types.d.ts +0 -76
  688. package/types/components/overlays/Notification/Notification.d.ts +0 -6
  689. package/types/services/notification.d.ts +0 -28
@@ -0,0 +1,69 @@
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 { useMemo, useRef } from 'react';
10
+ import { NotificationContext, PersistentNotificationsContext, ToastContext, } from './NotificationContext.js';
11
+ import { OverlayContainer } from './OverlayContainer.js';
12
+ import { useNotificationState } from './use-notification-state.js';
13
+ import { useOverlayTimers } from './use-overlay-timers.js';
14
+ import { usePersistentState } from './use-persistent-state.js';
15
+ import { useToastState } from './use-toast-state.js';
16
+ // ─── Re-export context hooks for consumers ───────────────────────────
17
+ export { useToastContext, useNotificationContext } from './NotificationContext.js';
18
+ // ─── Constants ───────────────────────────────────────────────────────
19
+ const DEFAULT_MAX_PERSISTENT = 200;
20
+ // ─── OverlayProvider ─────────────────────────────────────────────────
21
+ export function OverlayProvider({ children, maxPersistentNotifications = DEFAULT_MAX_PERSISTENT, }) {
22
+ // Shared ref that breaks the circular dependency between state hooks and timers.
23
+ // State hooks need timer methods (start/clear), timer hooks need remove methods.
24
+ // All consumers access the ref only inside useEvent/callbacks (never during
25
+ // render), so it is guaranteed to be populated before first use.
26
+ const timersRef = useRef(null);
27
+ // 1. Persistent state (no dependencies on other hooks)
28
+ const persistent = usePersistentState(maxPersistentNotifications);
29
+ // 2. Toast state — accesses timers through the shared ref
30
+ const toast = useToastState(timersRef);
31
+ // 3. Notification state — accesses timers through the shared ref
32
+ const notification = useNotificationState(timersRef, persistent);
33
+ // 4. Create timers and populate the ref
34
+ const timers = useOverlayTimers({
35
+ toastsRef: toast.toastsRef,
36
+ notificationsRef: notification.notificationsRef,
37
+ removeToast: toast.removeToast,
38
+ removeNotification: notification.removeNotification,
39
+ });
40
+ timersRef.current = timers;
41
+ // ─── Context Values ───────────────────────────────────────────────
42
+ // Only include actually-changing values in deps. All useEvent-based
43
+ // callbacks are referentially stable and omitted.
44
+ const toastContextValue = useMemo(() => ({
45
+ addToast: toast.addToast,
46
+ removeToast: toast.removeToast,
47
+ updateToast: toast.updateToast,
48
+ toasts: toast.toasts,
49
+ }), [toast.toasts]);
50
+ const notificationContextValue = useMemo(() => ({
51
+ addNotification: notification.addNotification,
52
+ removeNotification: notification.removeNotification,
53
+ updateNotification: notification.updateNotification,
54
+ notifications: notification.notifications,
55
+ addPersistentItem: persistent.addPersistentItem,
56
+ removePersistentItem: persistent.removePersistentItem,
57
+ removePersistentItemsByOwner: persistent.removePersistentItemsByOwner,
58
+ removeByOwner: notification.removeByOwner,
59
+ }), [notification.notifications]);
60
+ const persistentContextValue = useMemo(() => ({
61
+ persistentItems: persistent.persistentItems,
62
+ removePersistentItem: persistent.removePersistentItem,
63
+ clearPersistentItems: persistent.clearPersistentItems,
64
+ markAllAsRead: persistent.markAllAsRead,
65
+ }), [persistent.persistentItems]);
66
+ return (_jsx(ToastContext.Provider, { value: toastContextValue, children: _jsx(NotificationContext.Provider, { value: notificationContextValue, children: _jsxs(PersistentNotificationsContext.Provider, { value: persistentContextValue, children: [children, _jsx(OverlayContainer, { toasts: toast.toasts, notifications: notification.notifications, onToastExitComplete: toast.finalizeToastRemoval, onNotificationExitComplete: notification.finalizeNotificationRemoval, onNotificationDismiss: notification.removeNotification, onPauseChange: timers.handlePauseChange })] }) }) }));
67
+ }
68
+
69
+
@@ -0,0 +1,104 @@
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 { useEffect, useRef, useState } from 'react';
10
+ import { useEvent } from '../../../_internal/index.js';
11
+ import { tasty } from '../../../tasty/index.js';
12
+ import { Text } from '../../content/Text.js';
13
+ import { formatRelativeTime } from './format-relative-time.js';
14
+ import { NotificationCard } from './NotificationCard.js';
15
+ import { usePersistentNotifications } from './use-persistent-notifications.js';
16
+ // ─── Constants ───────────────────────────────────────────────────────
17
+ const MARK_READ_DELAY = 2000;
18
+ /** Interval (ms) at which relative timestamps refresh while the list is mounted. */
19
+ const TIMESTAMP_REFRESH_INTERVAL = 10_000;
20
+ // ─── Styled Components ──────────────────────────────────────────────
21
+ const ListContainer = tasty({
22
+ qa: 'PersistentNotificationsList',
23
+ role: 'log',
24
+ 'aria-label': 'Notifications',
25
+ styles: {
26
+ display: 'flex',
27
+ flow: 'column',
28
+ gap: '.5x',
29
+ },
30
+ });
31
+ const EmptyStateContainer = tasty({
32
+ styles: {
33
+ display: 'flex',
34
+ placeItems: 'center',
35
+ placeContent: 'center',
36
+ padding: '4x',
37
+ color: '#dark.5',
38
+ preset: 't3',
39
+ },
40
+ });
41
+ // ─── PersistentNotificationsList Component ───────────────────────────
42
+ /**
43
+ * Standardized rendering for archived/persistent notifications.
44
+ * Always reads items from the notification context.
45
+ * Composable with app-specific shells (popover, dialog, page section).
46
+ *
47
+ * Marks all items as read after being visible for 2 seconds.
48
+ * Relative timestamps refresh every 10 seconds while the list is mounted.
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * <PersistentNotificationsList
53
+ * onDismissItem={(item) => remove(item.id)}
54
+ * emptyState="No notifications"
55
+ * />
56
+ * ```
57
+ */
58
+ export function PersistentNotificationsList({ onDismissItem, emptyState, }) {
59
+ const { items, markAllAsRead } = usePersistentNotifications();
60
+ const markReadTimerRef = useRef(null);
61
+ // Tick counter that increments every TIMESTAMP_REFRESH_INTERVAL to force
62
+ // re-render so relative timestamps (e.g. "5 min ago") stay up to date.
63
+ const [, setTick] = useState(0);
64
+ useEffect(() => {
65
+ if (items.length === 0)
66
+ return;
67
+ const interval = setInterval(() => {
68
+ setTick((t) => t + 1);
69
+ }, TIMESTAMP_REFRESH_INTERVAL);
70
+ return () => clearInterval(interval);
71
+ }, [items.length]);
72
+ // Mark all persistent notifications as read after a 2s delay.
73
+ // Re-starts the timer whenever items change (e.g. new unread items arrive
74
+ // while the list is already visible).
75
+ useEffect(() => {
76
+ const hasUnread = items.some((i) => !i.isRead);
77
+ if (!hasUnread)
78
+ return;
79
+ markReadTimerRef.current = setTimeout(() => {
80
+ markAllAsRead();
81
+ }, MARK_READ_DELAY);
82
+ return () => {
83
+ if (markReadTimerRef.current) {
84
+ clearTimeout(markReadTimerRef.current);
85
+ markReadTimerRef.current = null;
86
+ }
87
+ };
88
+ }, [markAllAsRead, items]);
89
+ if (items.length === 0) {
90
+ return (_jsx(ListContainer, { children: _jsx(EmptyStateContainer, { children: emptyState ?? 'No notifications' }) }));
91
+ }
92
+ return (_jsx(ListContainer, { children: items.map((item) => (_jsx(PersistentNotificationListItem, { item: item, onDismiss: onDismissItem }, String(item.id)))) }));
93
+ }
94
+ function PersistentNotificationListItem({ item, onDismiss, }) {
95
+ const suffix = (_jsx(Text, { opacity: 0.5, preset: "c2", children: formatRelativeTime(item.createdAt) }));
96
+ // useEvent keeps the callback stable across re-renders regardless of
97
+ // item reference changes (avoids unnecessary NotificationCard re-renders).
98
+ const handleDismiss = useEvent((_id, _reason) => {
99
+ onDismiss?.(item);
100
+ });
101
+ return (_jsx(NotificationCard, { qa: "PersistentNotificationItem", theme: item.theme, title: item.title, description: item.description, icon: item.icon, actions: item.actions, isDismissible: !!onDismiss, notificationId: item.id, suffix: suffix, onDismiss: onDismiss ? handleDismiss : undefined }));
102
+ }
103
+
104
+
@@ -0,0 +1,55 @@
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
+ /**
9
+ * Lightweight relative time formatter.
10
+ * No external dependencies.
11
+ *
12
+ * Output format:
13
+ * - `just now` (< 1 minute)
14
+ * - `N min ago` (1–59 minutes)
15
+ * - `N h ago` (1–23 hours)
16
+ * - `N d ago` (1–6 days)
17
+ * - `N w ago` (1–4 weeks)
18
+ * - `N mo ago` (1–11 months)
19
+ * - `N y ago` (1+ years)
20
+ */
21
+ export function formatRelativeTime(timestamp) {
22
+ const now = Date.now();
23
+ const diffMs = now - timestamp;
24
+ if (diffMs < 0) {
25
+ return 'just now';
26
+ }
27
+ const diffSeconds = Math.floor(diffMs / 1000);
28
+ const diffMinutes = Math.floor(diffSeconds / 60);
29
+ const diffHours = Math.floor(diffMinutes / 60);
30
+ const diffDays = Math.floor(diffHours / 24);
31
+ if (diffMinutes < 1) {
32
+ return 'just now';
33
+ }
34
+ if (diffHours < 1) {
35
+ return `${diffMinutes} min ago`;
36
+ }
37
+ if (diffDays < 1) {
38
+ return `${diffHours} h ago`;
39
+ }
40
+ if (diffDays < 7) {
41
+ return `${diffDays} d ago`;
42
+ }
43
+ const diffWeeks = Math.floor(diffDays / 7);
44
+ if (diffDays < 30) {
45
+ return `${diffWeeks} w ago`;
46
+ }
47
+ const diffMonths = Math.floor(diffDays / 30);
48
+ if (diffDays < 365) {
49
+ return `${diffMonths} mo ago`;
50
+ }
51
+ const diffYears = Math.floor(diffDays / 365);
52
+ return `${diffYears} y ago`;
53
+ }
54
+
55
+
@@ -0,0 +1,51 @@
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
+ // ─── Components ──────────────────────────────────────────────────────
9
+ import { Notification as NotificationBase } from './Notification.js';
10
+ import { NotificationAction } from './NotificationAction.js';
11
+ export { NotificationAction } from './NotificationAction.js';
12
+ export { NotificationCard } from './NotificationCard.js';
13
+ export { NotificationItem } from './NotificationItem.js';
14
+ export { PersistentNotificationsList } from './PersistentNotificationsList.js';
15
+ // ─── Provider ────────────────────────────────────────────────────────
16
+ export { OverlayProvider } from './OverlayProvider.js';
17
+ // useToastContext is re-exported for Toast module backward compatibility
18
+ export { useToastContext } from './NotificationContext.js';
19
+ // ─── Hooks ───────────────────────────────────────────────────────────
20
+ export { useNotifications } from './use-notifications.js';
21
+ export { usePersistentNotifications, useNotificationsCount, } from './use-persistent-notifications.js';
22
+ // ─── Utilities ───────────────────────────────────────────────────────
23
+ export { formatRelativeTime } from './format-relative-time.js';
24
+ // ─── Compound Notification Component ─────────────────────────────────
25
+ /**
26
+ * Declarative Notification component with compound API.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * // Declarative usage
31
+ * <Notification
32
+ * id="release:new-version"
33
+ * theme="warning"
34
+ * title="New release available"
35
+ * description="2.0.0 can be installed now."
36
+ * actions={
37
+ * <>
38
+ * <Notification.Action>Later</Notification.Action>
39
+ * <Notification.Action onPress={() => openUpgradeDialog()}>
40
+ * Upgrade
41
+ * </Notification.Action>
42
+ * </>
43
+ * }
44
+ * />
45
+ * ```
46
+ */
47
+ export const Notification = Object.assign(NotificationBase, {
48
+ Action: NotificationAction,
49
+ });
50
+
51
+
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @license MIT
3
3
  * author: Cube Dev Team
4
- * @cube-dev/ui-kit v0.0.0-canary-b46ab85
4
+ * @cube-dev/ui-kit v0.0.0-canary-6b0df31
5
5
  * Released under the MIT license.
6
6
  */
7
7
 
@@ -0,0 +1,205 @@
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 { useRef, useState } from 'react';
9
+ import { useEvent } from '../../../_internal/index.js';
10
+ // ─── Constants ───────────────────────────────────────────────────────
11
+ const DEFAULT_NOTIFICATION_DURATION = 5000;
12
+ const DEFAULT_PERSISTENT_NOTIFICATION_DURATION = 10000;
13
+ const MAX_NOTIFICATIONS = 5;
14
+ // ─── Helpers ─────────────────────────────────────────────────────────
15
+ function getDuration(notif) {
16
+ if (notif.duration === null)
17
+ return null;
18
+ if (notif.duration !== undefined)
19
+ return notif.duration;
20
+ return notif.persistent
21
+ ? DEFAULT_PERSISTENT_NOTIFICATION_DURATION
22
+ : DEFAULT_NOTIFICATION_DURATION;
23
+ }
24
+ function matchesNotificationId(item, id) {
25
+ return item.id === id || item.internalId === String(id);
26
+ }
27
+ function findNotification(list, id) {
28
+ return list.find((n) => matchesNotificationId(n, id));
29
+ }
30
+ // ─── Hook ────────────────────────────────────────────────────────────
31
+ /**
32
+ * @param timersRef - Ref to the shared OverlayTimers instance. Accessed only
33
+ * inside callbacks (never during render), so it is guaranteed to be populated.
34
+ */
35
+ export function useNotificationState(timersRef, persistent) {
36
+ const [notifications, setNotifications] = useState([]);
37
+ const notificationsRef = useRef(notifications);
38
+ notificationsRef.current = notifications;
39
+ const idCounter = useRef(0);
40
+ // ─── Evict Helper ──────────────────────────────────────────────
41
+ /**
42
+ * Evict the oldest active notification to make room for a new one.
43
+ * Clears its timer and moves it to the persistent list if applicable.
44
+ * Must be called OUTSIDE setState updaters (StrictMode-safe).
45
+ */
46
+ const evictOldest = useEvent(() => {
47
+ const active = notificationsRef.current.filter((n) => !n.isExiting);
48
+ if (active.length === 0)
49
+ return null;
50
+ // Oldest by createdAt (active list preserves insertion order)
51
+ const oldest = active[0];
52
+ timersRef.current?.clearNotificationTimer(oldest.internalId);
53
+ // Eviction counts as a timeout dismissal — move to persistent list if applicable
54
+ if (oldest.persistent) {
55
+ persistent.addPersistentItem({
56
+ id: oldest.id ?? oldest.internalId,
57
+ theme: oldest.theme,
58
+ title: oldest.title,
59
+ description: oldest.description,
60
+ icon: oldest.icon,
61
+ actions: oldest.actions,
62
+ createdAt: oldest.createdAt,
63
+ updatedAt: oldest.updatedAt,
64
+ isRead: false,
65
+ ownerId: oldest.ownerId,
66
+ });
67
+ }
68
+ return oldest.internalId;
69
+ });
70
+ // ─── Remove ─────────────────────────────────────────────────────
71
+ const removeNotification = useEvent((id, reason = 'api') => {
72
+ // Read from ref (synchronous) to perform side effects OUTSIDE the updater.
73
+ // This prevents double-fire in StrictMode and avoids calling setState
74
+ // (addPersistentItem) inside another setState updater.
75
+ const notif = findNotification(notificationsRef.current, id);
76
+ if (!notif || notif.isExiting)
77
+ return;
78
+ timersRef.current?.clearNotificationTimer(notif.internalId);
79
+ // If persistent and dismissed by timeout, move to persistent list.
80
+ // User-initiated dismissals (action, close) intentionally skip persistence.
81
+ if (notif.persistent && reason === 'timeout') {
82
+ persistent.addPersistentItem({
83
+ id: notif.id ?? notif.internalId,
84
+ theme: notif.theme,
85
+ title: notif.title,
86
+ description: notif.description,
87
+ icon: notif.icon,
88
+ actions: notif.actions,
89
+ createdAt: notif.createdAt,
90
+ updatedAt: notif.updatedAt,
91
+ isRead: false,
92
+ ownerId: notif.ownerId,
93
+ });
94
+ }
95
+ setNotifications((prev) => prev.map((n) => matchesNotificationId(n, id) ? { ...n, isExiting: true } : n));
96
+ });
97
+ // ─── Finalize ──────────────────────────────────────────────────
98
+ const finalizeNotificationRemoval = useEvent((internalId) => {
99
+ setNotifications((prev) => prev.filter((n) => n.internalId !== internalId));
100
+ });
101
+ // ─── Add ────────────────────────────────────────────────────────
102
+ const addNotification = useEvent((options, ownerId) => {
103
+ idCounter.current += 1;
104
+ const internalId = `notif-${idCounter.current}-${Date.now()}`;
105
+ const now = Date.now();
106
+ const id = options.id ?? internalId;
107
+ // Check for existing notification with same id via the ref (synchronous read).
108
+ const existingNotif = options.id != null
109
+ ? notificationsRef.current.find((n) => n.id === options.id && !n.isExiting)
110
+ : undefined;
111
+ if (existingNotif) {
112
+ // In-place update of an existing notification
113
+ const returnId = existingNotif.id ?? existingNotif.internalId;
114
+ const prevTitle = existingNotif.title;
115
+ const prevDescription = existingNotif.description;
116
+ // Timer reset on string title/description change
117
+ const titleChanged = typeof options.title === 'string' &&
118
+ typeof prevTitle === 'string' &&
119
+ options.title !== prevTitle;
120
+ const descriptionChanged = typeof options.description === 'string' &&
121
+ typeof prevDescription === 'string' &&
122
+ options.description !== prevDescription;
123
+ if (titleChanged || descriptionChanged) {
124
+ const duration = getDuration(options);
125
+ if (duration != null && duration > 0) {
126
+ timersRef.current?.startNotificationTimer(existingNotif.internalId, existingNotif.id ?? existingNotif.internalId, duration);
127
+ }
128
+ }
129
+ setNotifications((prev) => prev.map((n) => {
130
+ if (n.internalId === existingNotif.internalId) {
131
+ return {
132
+ ...n,
133
+ ...options,
134
+ internalId: n.internalId,
135
+ createdAt: n.createdAt,
136
+ updatedAt: now,
137
+ ownerId: ownerId ?? n.ownerId,
138
+ };
139
+ }
140
+ return n;
141
+ }));
142
+ return returnId;
143
+ }
144
+ // New notification — always show immediately, evicting the oldest if at cap.
145
+ // Read from ref (synchronous) to perform side effects OUTSIDE the updater.
146
+ const activeCount = notificationsRef.current.filter((n) => !n.isExiting).length;
147
+ const newNotification = {
148
+ ...options,
149
+ id,
150
+ internalId,
151
+ createdAt: now,
152
+ updatedAt: now,
153
+ ownerId,
154
+ };
155
+ // Evict oldest if at cap (side effects outside updater)
156
+ let evictedInternalId = null;
157
+ if (activeCount >= MAX_NOTIFICATIONS) {
158
+ evictedInternalId = evictOldest();
159
+ }
160
+ // Start timer for the new notification
161
+ const duration = getDuration(options);
162
+ if (duration != null && duration > 0) {
163
+ timersRef.current?.startNotificationTimer(internalId, id, duration);
164
+ }
165
+ setNotifications((prev) => {
166
+ let next = prev;
167
+ if (evictedInternalId) {
168
+ next = next.map((n) => n.internalId === evictedInternalId ? { ...n, isExiting: true } : n);
169
+ }
170
+ return [...next, newNotification];
171
+ });
172
+ return id;
173
+ });
174
+ // ─── Update ─────────────────────────────────────────────────────
175
+ const updateNotification = useEvent((id, options) => {
176
+ setNotifications((prev) => prev.map((n) => matchesNotificationId(n, id)
177
+ ? { ...n, ...options, updatedAt: Date.now() }
178
+ : n));
179
+ });
180
+ // ─── Owner Cleanup ──────────────────────────────────────────────
181
+ const removeByOwner = useEvent((ownerId) => {
182
+ // Clear timers outside the updater (StrictMode-safe).
183
+ const owned = notificationsRef.current.filter((n) => n.ownerId === ownerId && !n.isExiting);
184
+ for (const n of owned) {
185
+ timersRef.current?.clearNotificationTimer(n.internalId);
186
+ }
187
+ setNotifications((prev) => prev.map((n) => {
188
+ if (n.ownerId === ownerId && !n.isExiting) {
189
+ return { ...n, isExiting: true };
190
+ }
191
+ return n;
192
+ }));
193
+ });
194
+ return {
195
+ notifications,
196
+ notificationsRef,
197
+ addNotification,
198
+ removeNotification,
199
+ updateNotification,
200
+ finalizeNotificationRemoval,
201
+ removeByOwner,
202
+ };
203
+ }
204
+
205
+
@@ -0,0 +1,175 @@
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 { useEvent } from '../../../_internal/index.js';
10
+ import { useWarn } from '../../../_internal/hooks/use-warn.js';
11
+ import { useNotificationContext } from './NotificationContext.js';
12
+ let ownerIdCounter = 0;
13
+ function generateOwnerId() {
14
+ ownerIdCounter += 1;
15
+ return `notif-owner-${ownerIdCounter}-${Date.now()}`;
16
+ }
17
+ function isStoredMode(options) {
18
+ return options.mode === 'stored';
19
+ }
20
+ /**
21
+ * Hook to display and manage notifications.
22
+ *
23
+ * Each hook instance acts as an owner scope:
24
+ * - `notify()` created from this instance attaches ownership metadata.
25
+ * - On unmount, all attached visible overlay notifications are dismissed.
26
+ * - On unmount, all attached persistent records are also removed.
27
+ * - `notify()`/`dismiss()` calls from stale closures after unmount are no-ops.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * const { notify, record, dismiss } = useNotifications();
32
+ *
33
+ * notify({
34
+ * id: 'deploy:123',
35
+ * theme: 'success',
36
+ * title: 'Deployment completed',
37
+ * description: 'Version 1.4.2 is live.',
38
+ * actions: (
39
+ * <>
40
+ * <Notification.Action onPress={() => openLogs()}>View logs</Notification.Action>
41
+ * <Notification.Action onPress={() => openDeployment()}>Open</Notification.Action>
42
+ * </>
43
+ * ),
44
+ * });
45
+ *
46
+ * // Store directly to persistent list (no overlay)
47
+ * record({
48
+ * id: 'server:alert-1',
49
+ * theme: 'warning',
50
+ * title: 'Server alert',
51
+ * });
52
+ * ```
53
+ */
54
+ export function useNotifications() {
55
+ const { addNotification, removeNotification, addPersistentItem, removePersistentItem, removeByOwner, removePersistentItemsByOwner, } = useNotificationContext();
56
+ const ownerIdRef = useRef(generateOwnerId());
57
+ const isMountedRef = useRef(true);
58
+ const cleanupTimerRef = useRef(null);
59
+ // Track current options for validation
60
+ const lastOptionsRef = useRef(null);
61
+ // ─── Validation Warnings ──────────────────────────────────────────
62
+ useWarn(lastOptionsRef.current &&
63
+ 'persistent' in lastOptionsRef.current &&
64
+ lastOptionsRef.current.persistent === true &&
65
+ lastOptionsRef.current.id == null, {
66
+ once: false,
67
+ key: ['Notification', 'persistent-without-id'],
68
+ args: [
69
+ 'Notification: `persistent: true` requires an explicit `id` for reliable dedupe/upsert.',
70
+ ],
71
+ });
72
+ useWarn(lastOptionsRef.current?.mode === 'stored' &&
73
+ lastOptionsRef.current.id == null, {
74
+ once: false,
75
+ key: ['Notification', 'stored-without-id'],
76
+ args: [
77
+ 'Notification: `mode: "stored"` should have an explicit `id` for reliable upsert.',
78
+ ],
79
+ });
80
+ // ─── Helpers ─────────────────────────────────────────────────────
81
+ const storedIdCounter = useRef(0);
82
+ const createStoredHandle = useEvent((options) => {
83
+ storedIdCounter.current += 1;
84
+ const now = Date.now();
85
+ const id = options.id ?? `stored-${storedIdCounter.current}-${now}`;
86
+ const createdAt = options.createdAt ?? now;
87
+ const persistentItem = {
88
+ id,
89
+ theme: options.theme,
90
+ title: options.title,
91
+ description: options.description,
92
+ icon: options.icon,
93
+ actions: options.actions ?? undefined,
94
+ createdAt,
95
+ updatedAt: createdAt,
96
+ ownerId: ownerIdRef.current,
97
+ };
98
+ addPersistentItem(persistentItem);
99
+ return {
100
+ id,
101
+ dismiss: () => {
102
+ removePersistentItem(id);
103
+ },
104
+ };
105
+ });
106
+ // ─── API ──────────────────────────────────────────────────────────
107
+ const notify = useEvent((options) => {
108
+ // Stale closure guard
109
+ if (!isMountedRef.current) {
110
+ return {
111
+ id: options.id ?? '',
112
+ dismiss: () => { },
113
+ };
114
+ }
115
+ lastOptionsRef.current = options;
116
+ if (isStoredMode(options)) {
117
+ return createStoredHandle(options);
118
+ }
119
+ // Overlay mode
120
+ const overlayOptions = {
121
+ ...options,
122
+ mode: 'overlay',
123
+ };
124
+ const notificationId = addNotification(overlayOptions, ownerIdRef.current);
125
+ return {
126
+ id: notificationId,
127
+ dismiss: () => {
128
+ if (isMountedRef.current) {
129
+ removeNotification(notificationId, 'api');
130
+ }
131
+ },
132
+ };
133
+ });
134
+ // `record()` is intentionally kept as a separate method from `notify()` to make
135
+ // the API more explicit: `record()` always stores directly to the persistent list
136
+ // (no overlay), while `notify()` defaults to overlay mode. Having both avoids
137
+ // the caller needing to remember to pass `mode: 'stored'` every time.
138
+ const record = useEvent((options) => {
139
+ // Stale closure guard
140
+ if (!isMountedRef.current) {
141
+ return {
142
+ id: options.id ?? '',
143
+ dismiss: () => { },
144
+ };
145
+ }
146
+ lastOptionsRef.current = { ...options, mode: 'stored' };
147
+ return createStoredHandle(options);
148
+ });
149
+ const dismiss = useEvent((id) => {
150
+ if (!isMountedRef.current)
151
+ return;
152
+ removeNotification(id, 'api');
153
+ });
154
+ // ─── Ownership Cleanup ────────────────────────────────────────────
155
+ useEffect(() => {
156
+ isMountedRef.current = true;
157
+ // Cancel any pending cleanup (Strict Mode re-mount)
158
+ if (cleanupTimerRef.current) {
159
+ clearTimeout(cleanupTimerRef.current);
160
+ cleanupTimerRef.current = null;
161
+ }
162
+ return () => {
163
+ isMountedRef.current = false;
164
+ // Deferred cleanup — cancelled if owner re-mounts within same tick
165
+ // (Strict Mode / Suspense safe)
166
+ cleanupTimerRef.current = setTimeout(() => {
167
+ removeByOwner(ownerIdRef.current);
168
+ removePersistentItemsByOwner(ownerIdRef.current);
169
+ }, 0);
170
+ };
171
+ }, [removeByOwner, removePersistentItemsByOwner]);
172
+ return { notify, record, dismiss };
173
+ }
174
+
175
+