@cube-dev/ui-kit 0.145.4 → 0.146.1

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 (536) hide show
  1. package/dist/CHANGELOG.md +12 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.d.ts +8 -0
  17. package/dist/components/Root.js +35 -30
  18. package/dist/components/Root.js.map +1 -1
  19. package/dist/components/actions/Action/Action.js +1 -1
  20. package/dist/components/actions/Banner/Banner.js +4 -2
  21. package/dist/components/actions/Banner/Banner.js.map +1 -1
  22. package/dist/components/actions/Button/Button.js +1 -1
  23. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  24. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  25. package/dist/components/actions/ButtonSplit/context.js +1 -1
  26. package/dist/components/actions/CommandMenu/CommandMenu.js +4 -2
  27. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  28. package/dist/components/actions/CommandMenu/styled.js +1 -1
  29. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  30. package/dist/components/actions/ItemActionContext.js +1 -1
  31. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  32. package/dist/components/actions/Link/Link.js +1 -1
  33. package/dist/components/actions/Menu/Menu.js +1 -1
  34. package/dist/components/actions/Menu/MenuItem.js +1 -1
  35. package/dist/components/actions/Menu/MenuSection.js +1 -1
  36. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  37. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  39. package/dist/components/actions/Menu/context.js +1 -1
  40. package/dist/components/actions/Menu/styled.js +1 -1
  41. package/dist/components/actions/index.js +1 -1
  42. package/dist/components/actions/use-action.js +1 -1
  43. package/dist/components/actions/use-anchored-menu.js +6 -3
  44. package/dist/components/actions/use-anchored-menu.js.map +1 -1
  45. package/dist/components/actions/use-context-menu.js +6 -3
  46. package/dist/components/actions/use-context-menu.js.map +1 -1
  47. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/dist/components/content/Alert/Alert.js +1 -1
  49. package/dist/components/content/Alert/use-alert.js +1 -1
  50. package/dist/components/content/Avatar/Avatar.js +1 -1
  51. package/dist/components/content/Badge/Badge.js +1 -1
  52. package/dist/components/content/Card/Card.js +1 -1
  53. package/dist/components/content/Content.js +1 -1
  54. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +7 -6
  55. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js.map +1 -1
  56. package/dist/components/content/CopySnippet/CopySnippet.js +9 -9
  57. package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
  58. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  59. package/dist/components/content/Divider.js +1 -1
  60. package/dist/components/content/Footer.js +1 -1
  61. package/dist/components/content/Header.js +1 -1
  62. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  63. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  64. package/dist/components/content/Item/Item.js +1 -1
  65. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  66. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  67. package/dist/components/content/Layout/GridLayout.js +1 -1
  68. package/dist/components/content/Layout/Layout.js +1 -1
  69. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  70. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  71. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  72. package/dist/components/content/Layout/LayoutContent.js +1 -1
  73. package/dist/components/content/Layout/LayoutContext.js +1 -1
  74. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  75. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  76. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  77. package/dist/components/content/Layout/LayoutHeader.js +4 -2
  78. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  79. package/dist/components/content/Layout/LayoutPane.js +1 -1
  80. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  81. package/dist/components/content/Layout/LayoutPanelHeader.js +9 -6
  82. package/dist/components/content/Layout/LayoutPanelHeader.js.map +1 -1
  83. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  84. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  85. package/dist/components/content/Layout/index.js +1 -1
  86. package/dist/components/content/Layout/utils.js +1 -1
  87. package/dist/components/content/Paragraph.js +1 -1
  88. package/dist/components/content/Placeholder/Placeholder.js +4 -2
  89. package/dist/components/content/Placeholder/Placeholder.js.map +1 -1
  90. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  91. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  92. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  93. package/dist/components/content/Result/Result.js +1 -1
  94. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  95. package/dist/components/content/Tag/Tag.js +4 -2
  96. package/dist/components/content/Tag/Tag.js.map +1 -1
  97. package/dist/components/content/Text.d.ts +14 -14
  98. package/dist/components/content/Text.js +1 -1
  99. package/dist/components/content/TextItem/TextItem.js +1 -1
  100. package/dist/components/content/Title.js +1 -1
  101. package/dist/components/content/Tree/Tree.js +1 -1
  102. package/dist/components/content/Tree/TreeNode.js +4 -2
  103. package/dist/components/content/Tree/TreeNode.js.map +1 -1
  104. package/dist/components/content/Tree/styled.js +1 -1
  105. package/dist/components/content/Tree/tree-index.js +1 -1
  106. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  107. package/dist/components/content/Tree/use-load-data.js +1 -1
  108. package/dist/components/content/highlightText.js +1 -1
  109. package/dist/components/content/use-auto-tooltip.js +1 -1
  110. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  111. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  112. package/dist/components/fields/Checkbox/context.js +1 -1
  113. package/dist/components/fields/ComboBox/ComboBox.js +5 -3
  114. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  115. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  116. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  117. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  118. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  119. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  120. package/dist/components/fields/DatePicker/DatePicker.js +4 -3
  121. package/dist/components/fields/DatePicker/DatePicker.js.map +1 -1
  122. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  123. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  124. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  125. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  126. package/dist/components/fields/DatePicker/DateRangePicker.js +5 -4
  127. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  128. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +6 -5
  129. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
  130. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  131. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  132. package/dist/components/fields/DatePicker/props.js +1 -1
  133. package/dist/components/fields/DatePicker/utils.js +1 -1
  134. package/dist/components/fields/FileInput/FileInput.js +5 -3
  135. package/dist/components/fields/FileInput/FileInput.js.map +1 -1
  136. package/dist/components/fields/FilterListBox/FilterListBox.js +9 -6
  137. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  138. package/dist/components/fields/FilterPicker/FilterPicker.js +5 -3
  139. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  140. package/dist/components/fields/Input/Input.js +1 -1
  141. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  142. package/dist/components/fields/ListBox/ListBox.js +9 -5
  143. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  144. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +4 -2
  145. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
  146. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  147. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  148. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  149. package/dist/components/fields/NumberInput/StepButton.js +5 -2
  150. package/dist/components/fields/NumberInput/StepButton.js.map +1 -1
  151. package/dist/components/fields/PasswordInput/PasswordInput.js +4 -2
  152. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  153. package/dist/components/fields/Picker/Picker.js +5 -3
  154. package/dist/components/fields/Picker/Picker.js.map +1 -1
  155. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  156. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  157. package/dist/components/fields/RadioGroup/context.js +1 -1
  158. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  159. package/dist/components/fields/Select/Select.js +1 -1
  160. package/dist/components/fields/Slider/Gradation.js +1 -1
  161. package/dist/components/fields/Slider/HueSlider.js +1 -1
  162. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  163. package/dist/components/fields/Slider/Slider.js +1 -1
  164. package/dist/components/fields/Slider/SliderBase.js +1 -1
  165. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  166. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  167. package/dist/components/fields/Slider/elements.js +1 -1
  168. package/dist/components/fields/Slider/index.js +1 -1
  169. package/dist/components/fields/Switch/Switch.js +1 -1
  170. package/dist/components/fields/TextArea/TextArea.js +1 -1
  171. package/dist/components/fields/TextInput/TextInput.js +1 -1
  172. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  173. package/dist/components/fields/TextInputMapper/TextInputMapper.js +7 -5
  174. package/dist/components/fields/TextInputMapper/TextInputMapper.js.map +1 -1
  175. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  176. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  177. package/dist/components/form/Form/Field.js +1 -1
  178. package/dist/components/form/Form/Form.js +1 -1
  179. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  180. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  181. package/dist/components/form/Form/SubmitError.js +4 -2
  182. package/dist/components/form/Form/SubmitError.js.map +1 -1
  183. package/dist/components/form/Form/index.js +1 -1
  184. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  185. package/dist/components/form/Form/use-field/use-field.js +1 -1
  186. package/dist/components/form/Form/use-form.js +1 -1
  187. package/dist/components/form/Form/validation.js +1 -1
  188. package/dist/components/form/Label.js +6 -8
  189. package/dist/components/form/Label.js.map +1 -1
  190. package/dist/components/form/wrapper.js +1 -1
  191. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  192. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  193. package/dist/components/layout/Board/Board.d.ts +3 -2
  194. package/dist/components/layout/Board/Board.js +1 -1
  195. package/dist/components/layout/Board/Board.js.map +1 -1
  196. package/dist/components/layout/Board/BoardProvider.js +1 -1
  197. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  198. package/dist/components/layout/Board/Widget.js +1 -1
  199. package/dist/components/layout/Board/WidgetHost.js +5 -1
  200. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  201. package/dist/components/layout/Board/board-context.js +1 -1
  202. package/dist/components/layout/Board/board-store.js +1 -1
  203. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  204. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  205. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  206. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  207. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  208. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  209. package/dist/components/layout/Board/index.js +1 -1
  210. package/dist/components/layout/Board/responsive-utils.js +1 -1
  211. package/dist/components/layout/Board/use-board-layout.js +1 -1
  212. package/dist/components/layout/Board/use-board-registry.js +1 -1
  213. package/dist/components/layout/Flex.js +1 -1
  214. package/dist/components/layout/Flow.js +1 -1
  215. package/dist/components/layout/Grid.js +1 -1
  216. package/dist/components/layout/Panel.js +1 -1
  217. package/dist/components/layout/Prefix.js +1 -1
  218. package/dist/components/layout/ResizablePanel.js +1 -1
  219. package/dist/components/layout/Space.js +1 -1
  220. package/dist/components/layout/Suffix.js +1 -1
  221. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  222. package/dist/components/navigation/Tabs/TabButton.js +7 -4
  223. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  224. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  225. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  226. package/dist/components/navigation/Tabs/TabPicker.js +5 -3
  227. package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
  228. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  229. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  230. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  231. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  232. package/dist/components/navigation/Tabs/styled.js +1 -1
  233. package/dist/components/navigation/Tabs/types.js +1 -1
  234. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  235. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  236. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  237. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  238. package/dist/components/other/Calendar/Calendar.js +1 -1
  239. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  240. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  241. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  242. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  243. package/dist/components/overlays/AlertDialog/AlertDialog.js +8 -6
  244. package/dist/components/overlays/AlertDialog/AlertDialog.js.map +1 -1
  245. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  246. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  247. package/dist/components/overlays/Dialog/Dialog.js +5 -8
  248. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  249. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  250. package/dist/components/overlays/Dialog/DialogForm.js +5 -3
  251. package/dist/components/overlays/Dialog/DialogForm.js.map +1 -1
  252. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  253. package/dist/components/overlays/Dialog/context.js +1 -1
  254. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  255. package/dist/components/overlays/Modal/Modal.js +1 -1
  256. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  257. package/dist/components/overlays/Modal/Overlay.js +1 -1
  258. package/dist/components/overlays/Modal/Popover.js +1 -1
  259. package/dist/components/overlays/Modal/Tray.js +1 -1
  260. package/dist/components/overlays/Modal/Underlay.js +1 -1
  261. package/dist/components/overlays/Notifications/Notification.js +1 -1
  262. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  263. package/dist/components/overlays/Notifications/NotificationCard.js +4 -2
  264. package/dist/components/overlays/Notifications/NotificationCard.js.map +1 -1
  265. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  266. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  267. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  268. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  269. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +17 -8
  270. package/dist/components/overlays/Notifications/PersistentNotificationsList.js.map +1 -1
  271. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  272. package/dist/components/overlays/Notifications/format-relative-time.d.ts +9 -3
  273. package/dist/components/overlays/Notifications/format-relative-time.js +20 -12
  274. package/dist/components/overlays/Notifications/format-relative-time.js.map +1 -1
  275. package/dist/components/overlays/Notifications/index.js +1 -1
  276. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  277. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  278. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  279. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  280. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  281. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  282. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  283. package/dist/components/overlays/Toast/index.js +1 -1
  284. package/dist/components/overlays/Toast/useProgressToast.js +6 -3
  285. package/dist/components/overlays/Toast/useProgressToast.js.map +1 -1
  286. package/dist/components/overlays/Toast/useToast.js +1 -1
  287. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  288. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  289. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  290. package/dist/components/overlays/Tooltip/context.js +1 -1
  291. package/dist/components/portal/Portal.js +1 -1
  292. package/dist/components/portal/PortalProvider.js +1 -1
  293. package/dist/components/portal/usePortal.js +1 -1
  294. package/dist/components/shared/DraggableCollection.js +1 -1
  295. package/dist/components/shared/InvalidIcon.js +1 -1
  296. package/dist/components/shared/ValidIcon.js +1 -1
  297. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +4 -2
  298. package/dist/components/status/LoadingAnimation/LoadingAnimation.js.map +1 -1
  299. package/dist/components/status/Spin/Cube.js +1 -1
  300. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  301. package/dist/components/status/Spin/Spin.js +1 -1
  302. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  303. package/dist/data/item-themes.js +1 -1
  304. package/dist/data/themes.js +1 -1
  305. package/dist/i18n/I18nProvider.d.ts +29 -0
  306. package/dist/i18n/I18nProvider.js +46 -0
  307. package/dist/i18n/I18nProvider.js.map +1 -0
  308. package/dist/i18n/createFormatter.d.ts +59 -0
  309. package/dist/i18n/createFormatter.js +148 -0
  310. package/dist/i18n/createFormatter.js.map +1 -0
  311. package/dist/i18n/index.d.ts +18 -0
  312. package/dist/i18n/index.js +21 -0
  313. package/dist/i18n/index.js.map +1 -0
  314. package/dist/i18n/instance.d.ts +22 -0
  315. package/dist/i18n/instance.js +78 -0
  316. package/dist/i18n/instance.js.map +1 -0
  317. package/dist/i18n/locales/de-DE/uikit.js +112 -0
  318. package/dist/i18n/locales/de-DE/uikit.js.map +1 -0
  319. package/dist/i18n/locales/en-US/uikit.js +112 -0
  320. package/dist/i18n/locales/en-US/uikit.js.map +1 -0
  321. package/dist/i18n/locales/en-US/uikit.json.d.ts +140 -0
  322. package/dist/i18n/locales/es-ES/uikit.js +112 -0
  323. package/dist/i18n/locales/es-ES/uikit.js.map +1 -0
  324. package/dist/i18n/locales/es-MX/uikit.js +112 -0
  325. package/dist/i18n/locales/es-MX/uikit.js.map +1 -0
  326. package/dist/i18n/locales/fr-FR/uikit.js +112 -0
  327. package/dist/i18n/locales/fr-FR/uikit.js.map +1 -0
  328. package/dist/i18n/locales/it-IT/uikit.js +112 -0
  329. package/dist/i18n/locales/it-IT/uikit.js.map +1 -0
  330. package/dist/i18n/locales/ja-JP/uikit.js +112 -0
  331. package/dist/i18n/locales/ja-JP/uikit.js.map +1 -0
  332. package/dist/i18n/locales/nb-NO/uikit.js +112 -0
  333. package/dist/i18n/locales/nb-NO/uikit.js.map +1 -0
  334. package/dist/i18n/locales/pt-BR/uikit.js +112 -0
  335. package/dist/i18n/locales/pt-BR/uikit.js.map +1 -0
  336. package/dist/i18n/locales/pt-PT/uikit.js +112 -0
  337. package/dist/i18n/locales/pt-PT/uikit.js.map +1 -0
  338. package/dist/i18n/locales/sv-SE/uikit.js +112 -0
  339. package/dist/i18n/locales/sv-SE/uikit.js.map +1 -0
  340. package/dist/i18n/locales/vi-VN/uikit.js +112 -0
  341. package/dist/i18n/locales/vi-VN/uikit.js.map +1 -0
  342. package/dist/i18n/locales.d.ts +17 -0
  343. package/dist/i18n/locales.js +45 -0
  344. package/dist/i18n/locales.js.map +1 -0
  345. package/dist/i18n/useFormatter.d.ts +26 -0
  346. package/dist/i18n/useFormatter.js +32 -0
  347. package/dist/i18n/useFormatter.js.map +1 -0
  348. package/dist/i18n/useI18n.d.ts +2 -0
  349. package/dist/i18n/useI18n.js +18 -0
  350. package/dist/i18n/useI18n.js.map +1 -0
  351. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  352. package/dist/icons/AdjustmentsIcon.js +1 -1
  353. package/dist/icons/AiIcon.js +1 -1
  354. package/dist/icons/AreaChartIcon.js +1 -1
  355. package/dist/icons/BackwardIcon.js +1 -1
  356. package/dist/icons/BarChartIcon.js +1 -1
  357. package/dist/icons/BellFilledIcon.js +1 -1
  358. package/dist/icons/BellIcon.js +1 -1
  359. package/dist/icons/BooleanIcon.js +1 -1
  360. package/dist/icons/CalendarEditIcon.js +1 -1
  361. package/dist/icons/CalendarIcon.js +1 -1
  362. package/dist/icons/CaretDownIcon.js +1 -1
  363. package/dist/icons/CaretUpIcon.js +1 -1
  364. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  365. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  366. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  367. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  368. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  369. package/dist/icons/ChartBarLineIcon.js +1 -1
  370. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  371. package/dist/icons/ChartBarStackedIcon.js +1 -1
  372. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  373. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  374. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  375. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  376. package/dist/icons/ChartBubbleIcon.js +1 -1
  377. package/dist/icons/ChartDonut2Icon.js +1 -1
  378. package/dist/icons/ChartFunnelIcon.js +1 -1
  379. package/dist/icons/ChartHeatmapIcon.js +1 -1
  380. package/dist/icons/ChartKPIIcon.js +1 -1
  381. package/dist/icons/ChartPie2Icon.js +1 -1
  382. package/dist/icons/ChartScatterIcon.js +1 -1
  383. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  384. package/dist/icons/CheckCircleIcon.js +1 -1
  385. package/dist/icons/CheckIcon.js +1 -1
  386. package/dist/icons/CircleFilledIcon.js +1 -1
  387. package/dist/icons/ClearIcon.js +1 -1
  388. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  389. package/dist/icons/CloseCircleIcon.js +1 -1
  390. package/dist/icons/CloseIcon.js +1 -1
  391. package/dist/icons/CodeIcon.js +1 -1
  392. package/dist/icons/ColumnTotalIcon.js +1 -1
  393. package/dist/icons/CopyIcon.js +1 -1
  394. package/dist/icons/CountIcon.js +1 -1
  395. package/dist/icons/CubeIcon.js +1 -1
  396. package/dist/icons/CubePauseIcon.js +1 -1
  397. package/dist/icons/CubePlayIcon.js +1 -1
  398. package/dist/icons/CurrencyDollarIcon.js +1 -1
  399. package/dist/icons/DangerIcon.js +1 -1
  400. package/dist/icons/DashboardIcon.js +1 -1
  401. package/dist/icons/DatabaseIcon.js +1 -1
  402. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  403. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  404. package/dist/icons/DirectionIcon.js +1 -1
  405. package/dist/icons/DonutIcon.js +1 -1
  406. package/dist/icons/DownIcon.js +1 -1
  407. package/dist/icons/EditIcon.js +1 -1
  408. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  409. package/dist/icons/ExclamationCircleIcon.js +1 -1
  410. package/dist/icons/ExclamationIcon.js +1 -1
  411. package/dist/icons/EyeIcon.js +1 -1
  412. package/dist/icons/EyeInvisibleIcon.js +1 -1
  413. package/dist/icons/FilterIcon.js +1 -1
  414. package/dist/icons/FolderFilledIcon.js +1 -1
  415. package/dist/icons/FolderIcon.js +1 -1
  416. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  417. package/dist/icons/FolderOpenIcon.js +1 -1
  418. package/dist/icons/ForwardIcon.js +1 -1
  419. package/dist/icons/GripVerticalIcon.js +1 -1
  420. package/dist/icons/HierarchyIcon.js +1 -1
  421. package/dist/icons/HierarchyOpenIcon.js +1 -1
  422. package/dist/icons/Icon.js +1 -1
  423. package/dist/icons/InfoCircleIcon.js +1 -1
  424. package/dist/icons/InfoIcon.js +1 -1
  425. package/dist/icons/KeyIcon.js +1 -1
  426. package/dist/icons/LeftIcon.js +1 -1
  427. package/dist/icons/LineChartIcon.js +1 -1
  428. package/dist/icons/LoadingIcon.js +1 -1
  429. package/dist/icons/LockFilledIcon.js +1 -1
  430. package/dist/icons/LockIcon.js +1 -1
  431. package/dist/icons/MoreIcon.js +1 -1
  432. package/dist/icons/NotAllowedIcon.js +1 -1
  433. package/dist/icons/Number123Icon.js +1 -1
  434. package/dist/icons/NumberIcon.js +1 -1
  435. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  436. package/dist/icons/PauseCircleIcon.js +1 -1
  437. package/dist/icons/PauseIcon.js +1 -1
  438. package/dist/icons/PercentageIcon.js +1 -1
  439. package/dist/icons/PieChartIcon.js +1 -1
  440. package/dist/icons/PlayCircleIcon.js +1 -1
  441. package/dist/icons/PlayIcon.js +1 -1
  442. package/dist/icons/PlusIcon.js +1 -1
  443. package/dist/icons/ProgressBarIcon.js +1 -1
  444. package/dist/icons/ReloadIcon.js +1 -1
  445. package/dist/icons/ReportIcon.js +1 -1
  446. package/dist/icons/ReturnIcon.js +1 -1
  447. package/dist/icons/RightIcon.js +1 -1
  448. package/dist/icons/RowTotalsIcon.js +1 -1
  449. package/dist/icons/SchemeIcon.js +1 -1
  450. package/dist/icons/SearchIcon.js +1 -1
  451. package/dist/icons/SemanticQueryIcon.js +1 -1
  452. package/dist/icons/SettingsIcon.js +1 -1
  453. package/dist/icons/ShieldFilledIcon.js +1 -1
  454. package/dist/icons/ShieldIcon.js +1 -1
  455. package/dist/icons/SlashIcon.js +1 -1
  456. package/dist/icons/SparklesIcon.js +1 -1
  457. package/dist/icons/SqlIcon.js +1 -1
  458. package/dist/icons/StatsIcon.js +1 -1
  459. package/dist/icons/StopIcon.js +1 -1
  460. package/dist/icons/StringIcon.js +1 -1
  461. package/dist/icons/SubtotalsIcon.js +1 -1
  462. package/dist/icons/SwitchIcon.js +1 -1
  463. package/dist/icons/TableIcon.js +1 -1
  464. package/dist/icons/ThumbsDownIcon.js +1 -1
  465. package/dist/icons/ThumbsUpIcon.js +1 -1
  466. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  467. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  468. package/dist/icons/ThunderboltIcon.js +1 -1
  469. package/dist/icons/TimeIcon.js +1 -1
  470. package/dist/icons/TrashIcon.js +1 -1
  471. package/dist/icons/UnlockIcon.js +1 -1
  472. package/dist/icons/UpIcon.js +1 -1
  473. package/dist/icons/UserGroupIcon.js +1 -1
  474. package/dist/icons/UserIcon.js +1 -1
  475. package/dist/icons/UserLockIcon.js +1 -1
  476. package/dist/icons/ViewIcon.js +1 -1
  477. package/dist/icons/WarningFilledIcon.js +1 -1
  478. package/dist/icons/WarningIcon.js +1 -1
  479. package/dist/icons/wrap-icon.js +1 -1
  480. package/dist/index.d.ts +10 -1
  481. package/dist/index.js +11 -2
  482. package/dist/index.js.map +1 -1
  483. package/dist/provider.js +1 -1
  484. package/dist/providers/TrackingProvider.js +1 -1
  485. package/dist/providers/navigationAdapter.default.js +1 -1
  486. package/dist/tokens/base.js +1 -1
  487. package/dist/tokens/colors.js +1 -1
  488. package/dist/tokens/index.js +1 -1
  489. package/dist/tokens/layout.js +1 -1
  490. package/dist/tokens/palette.js +1 -1
  491. package/dist/tokens/shadows.js +1 -1
  492. package/dist/tokens/sizes.js +1 -1
  493. package/dist/tokens/spacing.js +1 -1
  494. package/dist/tokens/typography.js +1 -1
  495. package/dist/utils/ResizeSensor.js +1 -1
  496. package/dist/utils/is-dev-env.js +1 -1
  497. package/dist/utils/modules.js +1 -1
  498. package/dist/utils/promise.js +1 -1
  499. package/dist/utils/raf.js +1 -1
  500. package/dist/utils/random.js +1 -1
  501. package/dist/utils/range.js +1 -1
  502. package/dist/utils/react/RenderCache.js +1 -1
  503. package/dist/utils/react/Slots.js +1 -1
  504. package/dist/utils/react/chain.js +1 -1
  505. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  506. package/dist/utils/react/index.js +1 -1
  507. package/dist/utils/react/interactions.js +1 -1
  508. package/dist/utils/react/isTextOnly.js +1 -1
  509. package/dist/utils/react/mapProps.js +1 -1
  510. package/dist/utils/react/mergeProps.js +1 -1
  511. package/dist/utils/react/nullableValue.js +1 -1
  512. package/dist/utils/react/resolveIcon.js +1 -1
  513. package/dist/utils/react/sharedStore.js +1 -1
  514. package/dist/utils/react/useCombinedRefs.js +1 -1
  515. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  516. package/dist/utils/react/useEventBus.js +1 -1
  517. package/dist/utils/react/useId.js +1 -1
  518. package/dist/utils/react/useIsDarwin.js +1 -1
  519. package/dist/utils/react/useKeySymbols.js +1 -1
  520. package/dist/utils/react/useLayoutEffect.js +1 -1
  521. package/dist/utils/react/useLocalStorage.js +1 -1
  522. package/dist/utils/react/useMergeStyles.js +1 -1
  523. package/dist/utils/react/usePopoverSync.js +1 -1
  524. package/dist/utils/react/useQaProps.js +1 -1
  525. package/dist/utils/react/useViewportSize.js +1 -1
  526. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  527. package/dist/utils/selection.js +1 -1
  528. package/dist/utils/styles.js +1 -1
  529. package/dist/utils/tree.js +1 -1
  530. package/dist/utils/warnings.js +1 -1
  531. package/dist/version.js +2 -2
  532. package/docs/components/Root.md +15 -1
  533. package/docs/components/layout/Board.md +4 -2
  534. package/package.json +3 -1
  535. package/dist/components/fields/DatePicker/intl.js +0 -11
  536. package/dist/components/fields/DatePicker/intl.js.map +0 -1
@@ -1,7 +1,8 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
4
4
  import { SlotProvider } from "../../../utils/react/Slots.js";
5
+ import { useI18n } from "../../../i18n/useI18n.js";
5
6
  import { CloseIcon } from "../../../icons/CloseIcon.js";
6
7
  import { useOpenTransitionContext } from "../Modal/OpenTransitionContext.js";
7
8
  import { _ItemButton } from "../../actions/ItemButton/ItemButton.js";
@@ -9,7 +10,7 @@ import { useDialogContext } from "./context.js";
9
10
  import { BASE_STYLES, BLOCK_STYLES, DIMENSION_STYLES, FLOW_STYLES, tasty } from "@tenphi/tasty";
10
11
  import { forwardRef, useEffect, useMemo } from "react";
11
12
  import { jsx, jsxs } from "react/jsx-runtime";
12
- import { DismissButton, FocusScope, useDialog, useMessageFormatter } from "react-aria";
13
+ import { DismissButton, FocusScope, useDialog } from "react-aria";
13
14
  import { createFocusManager } from "@react-aria/focus";
14
15
  import { useObjectRef } from "@react-aria/utils";
15
16
 
@@ -104,10 +105,6 @@ const sizePxMap = {
104
105
  medium: 479,
105
106
  large: 798
106
107
  };
107
- const intlMessages = { "en-US": {
108
- dismiss: "Dismiss",
109
- alert: "Alert"
110
- } };
111
108
  /**
112
109
  * Dialogs are windows containing contextual information, tasks, or workflows that appear over the user interface.
113
110
  * Depending on the kind of Dialog, further interactions may be blocked until the Dialog is acknowledged.
@@ -132,7 +129,7 @@ const DialogContent = forwardRef(function DialogContent(props, ref) {
132
129
  let { qa, children, size = "M", isDismissable = contextProps.isDismissable, onDismiss = contextProps.onClose, closeIcon, closeButtonStyles, style, ...otherProps } = props;
133
130
  size = sizeMap[size.toUpperCase()] || size;
134
131
  const styles = extractStyles(otherProps, STYLES_LIST);
135
- let formatMessage = useMessageFormatter(intlMessages);
132
+ const { t } = useI18n();
136
133
  let domRef = useObjectRef(ref);
137
134
  let { dialogProps, titleProps } = useDialog(mergeProps$1(contextProps, props), domRef);
138
135
  let dismissButton;
@@ -208,7 +205,7 @@ const DialogContent = forwardRef(function DialogContent(props, ref) {
208
205
  slots,
209
206
  children: [isDismissable && /* @__PURE__ */ jsx(CloseButton, {
210
207
  icon: closeIcon || /* @__PURE__ */ jsx(CloseIcon, { size: 20 }),
211
- label: formatMessage("dismiss"),
208
+ label: t("dialog.dismiss", "Dismiss"),
212
209
  onPress: () => onDismiss && onDismiss()
213
210
  }), children]
214
211
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","names":["ItemButton","mergeProps"],"sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import { createFocusManager } from '@react-aria/focus';\nimport { useObjectRef } from '@react-aria/utils';\nimport {\n BASE_STYLES,\n BaseProps,\n BaseStyleProps,\n BLOCK_STYLES,\n BlockStyleProps,\n DIMENSION_STYLES,\n DimensionStyleProps,\n FLOW_STYLES,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport { forwardRef, ReactElement, Ref, useEffect, useMemo } from 'react';\nimport {\n AriaDialogProps,\n DismissButton,\n FocusScope,\n useDialog,\n useMessageFormatter,\n} from 'react-aria';\n\nimport { CloseIcon } from '../../../icons';\nimport { mergeProps, SlotProvider } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { ItemButton } from '../../actions';\nimport { useOpenTransitionContext } from '../Modal/OpenTransitionContext';\n\nimport { useDialogContext } from './context';\n\nconst STYLES_LIST = [\n ...BASE_STYLES,\n ...DIMENSION_STYLES,\n ...BLOCK_STYLES,\n ...FLOW_STYLES,\n];\n\nconst DialogElement = tasty({\n as: 'section',\n styles: {\n display: 'flex',\n flow: 'column',\n fill: '#surface',\n pointerEvents: 'auto',\n outline: 0,\n position: {\n '': 'relative',\n 'type=panel': 'absolute',\n },\n width: {\n '': '$min-dialog-size $dialog-size (100dvw - 8x)',\n 'type=fullscreen': '(100dvw - 8x) (100dvw - 8x)',\n 'type=fullscreenTakeover': '100dvw 100dvw',\n 'type=panel': 'auto',\n },\n height: {\n '': 'auto (100dvh - 8x)',\n 'type=fullscreen': '(100dvh - 8x) (100dvh - 8x)',\n 'type=fullscreenTakeover | type=panel': '100dvh 100dvh',\n 'type=popover': 'initial initial (50dvh - 5x)',\n },\n gap: 0,\n border: {\n '': false,\n 'type=popover': true,\n },\n radius: {\n '': '1cr',\n 'type=tray': '1cr top',\n 'type=fullscreenTakeover': '0r',\n },\n shadow: {\n '': '$dialog-shadow',\n 'type=popover | type=panel': '$shadow',\n },\n top: {\n '': false,\n 'type=modal': '((50vh - 50%) / -3)',\n 'type=panel': 'auto',\n },\n '$dialog-title-padding-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-content-padding-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-padding-h': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-footer-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-content-gap': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n },\n});\n\nconst CloseButton = tasty(ItemButton, {\n qa: 'ModalCloseButton',\n type: 'clear',\n styles: {\n position: 'absolute',\n top: '1x',\n right: '1x',\n },\n});\n\nconst sizeMap = {\n S: 'small',\n M: 'medium',\n L: 'large',\n};\nconst sizePxMap = {\n small: 360,\n medium: 479,\n large: 798,\n};\n\nconst intlMessages = {\n 'en-US': {\n dismiss: 'Dismiss',\n alert: 'Alert',\n },\n};\n\nexport interface CubeDialogProps\n extends Omit<BaseProps, 'role'>,\n AriaDialogProps,\n BaseStyleProps,\n BlockStyleProps,\n DimensionStyleProps {\n /** The size of the dialog */\n size?: 'S' | 'M' | 'L' | 'small' | 'medium' | 'large';\n /** Whether the dialog is dismissable */\n isDismissable?: boolean;\n /** Trigger when the dialog is dismissed */\n onDismiss?: (arg?: any) => void;\n /** That you can replace the close icon with */\n closeIcon?: ReactElement;\n closeButtonStyles?: Styles;\n role?: 'dialog' | 'alertdialog';\n}\n\n/**\n * Dialogs are windows containing contextual information, tasks, or workflows that appear over the user interface.\n * Depending on the kind of Dialog, further interactions may be blocked until the Dialog is acknowledged.\n */\nexport const Dialog = forwardRef(function Dialog(\n props: CubeDialogProps,\n ref: Ref<HTMLDivElement>,\n) {\n const transitionContext = useOpenTransitionContext();\n\n const isEntered = transitionContext?.transitionState === 'entered';\n\n const context = useDialogContext();\n\n const content = useMemo(() => {\n return <DialogContent key=\"content\" {...props} ref={ref} />;\n }, [props, ref]);\n\n const shouldContainFocus =\n isEntered && !!context.isOpen && context.type !== 'panel';\n\n return (\n // This component traps the focus inside the dialog and restores it on close.\n <FocusScope restoreFocus contain={shouldContainFocus}>\n {content}\n </FocusScope>\n );\n});\n\nconst DialogContent = forwardRef(function DialogContent(\n props: CubeDialogProps,\n ref: Ref<HTMLDivElement>,\n) {\n let { type = 'modal', ...contextProps } = useDialogContext();\n\n let {\n qa,\n children,\n size = 'M',\n isDismissable = contextProps.isDismissable,\n onDismiss = contextProps.onClose,\n closeIcon,\n closeButtonStyles,\n style,\n ...otherProps\n } = props;\n\n size = sizeMap[size.toUpperCase()] || size;\n\n const styles: Styles = extractStyles(otherProps, STYLES_LIST);\n\n let formatMessage = useMessageFormatter(intlMessages);\n\n let domRef = useObjectRef(ref);\n let { dialogProps, titleProps } = useDialog(\n mergeProps(contextProps, props),\n domRef,\n );\n\n // If rendered in a popover or tray there won't be a visible dismiss button,\n // so we render a hidden one for screen readers.\n let dismissButton;\n if (type === 'popover' || type === 'tray') {\n dismissButton = <DismissButton onDismiss={onDismiss} />;\n }\n\n // Focus the first focusable element in the dialog when it opens.\n //\n // We also re-run the priority focus logic when the dialog <section>\n // itself is the active element. This recovers from a race that occurs\n // when a popover-based component (FilterPicker, Picker, Select, …) opens\n // inside another contained Dialog: React's native `autoFocus` on the\n // inner control fires during the mutation phase, before the popover's\n // FocusScope registers in react-aria's focus-scope tree, so the outer\n // FocusScope yanks focus back. useDialog then defaults focus to the\n // dialog <section>; without re-promoting it here, the priority element\n // (e.g. the search input) is never focused.\n useEffect(() => {\n if (contextProps.isOpen) {\n setTimeout(() => {\n if (!domRef.current) return;\n\n const activeElement = document.activeElement;\n const isFocusOutsideDialog = !domRef.current.contains(activeElement);\n const isFocusOnDialogShell = activeElement === domRef.current;\n\n // Priority 1: autofocus input or primary button\n const priorityElement = domRef.current.querySelector(\n 'input[data-autofocus], button[type=\"submit\"], button[data-type=\"primary\"]',\n ) as HTMLElement | null;\n\n if (priorityElement && (isFocusOutsideDialog || isFocusOnDialogShell)) {\n priorityElement.focus();\n return;\n }\n\n if (isFocusOutsideDialog) {\n // Fallback: focus first tabbable element, or dialog itself\n const focusManager = createFocusManager(domRef);\n\n if (!focusManager.focusFirst({ tabbable: true })) {\n domRef.current.focus();\n }\n }\n });\n }\n }, [contextProps.isOpen]);\n\n // let hasHeader = useHasChild('[data-id=\"Header\"]', domRef);\n // let hasFooter = useHasChild('[data-id=\"Footer\"]', domRef);\n\n let slots = {\n title: {\n level: 2,\n preset: 'h4',\n ...titleProps,\n },\n content: {\n styles: {\n flexGrow: 1,\n padding: '$dialog-content-padding-v $dialog-padding-h',\n gap: '$dialog-content-gap',\n height: {\n '': 'max (100% - (2 * $dialog-content-padding-v))',\n ':last-child': 'max (100% - $dialog-content-padding-v)',\n },\n },\n },\n header: {\n ellipsis: true,\n styles: {\n display: 'flex',\n flow: 'row',\n gap: '1x',\n placeItems: 'center stretch',\n placeContent: 'space-between',\n padding: `$dialog-title-padding-v ${\n isDismissable ? '($dialog-padding-h + 4x)' : '$dialog-padding-h'\n } $dialog-title-padding-v $dialog-padding-h`,\n border: 'bottom',\n },\n },\n footer: {\n styles: {\n display: 'flex',\n gap: '1x',\n flow: 'row-reverse',\n placeItems: 'baseline stretch',\n placeContent: 'space-between',\n padding: '$dialog-footer-v $dialog-padding-h',\n },\n },\n buttonGroup: {\n styles: {\n flow: 'row-reverse',\n },\n },\n };\n\n return (\n <DialogElement\n ref={domRef}\n data-id=\"Dialog\"\n data-qa={qa || 'Dialog'}\n styles={styles}\n as=\"section\"\n {...dialogProps}\n mods={{ dismissable: isDismissable }}\n style={{\n '--dialog-size': `${sizePxMap[size] || sizePxMap.small}px`,\n ...style,\n }}\n data-type={type}\n data-size={size}\n >\n {dismissButton}\n\n <SlotProvider slots={slots}>\n {isDismissable && (\n <CloseButton\n icon={closeIcon || <CloseIcon size={20} />}\n label={formatMessage('dismiss')}\n onPress={() => onDismiss && onDismiss()}\n />\n )}\n {children}\n </SlotProvider>\n </DialogElement>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","names":["ItemButton","mergeProps"],"sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import { createFocusManager } from '@react-aria/focus';\nimport { useObjectRef } from '@react-aria/utils';\nimport {\n BASE_STYLES,\n BaseProps,\n BaseStyleProps,\n BLOCK_STYLES,\n BlockStyleProps,\n DIMENSION_STYLES,\n DimensionStyleProps,\n FLOW_STYLES,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport { forwardRef, ReactElement, Ref, useEffect, useMemo } from 'react';\nimport {\n AriaDialogProps,\n DismissButton,\n FocusScope,\n useDialog,\n} from 'react-aria';\n\nimport { useI18n } from '../../../i18n';\nimport { CloseIcon } from '../../../icons';\nimport { mergeProps, SlotProvider } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { ItemButton } from '../../actions';\nimport { useOpenTransitionContext } from '../Modal/OpenTransitionContext';\n\nimport { useDialogContext } from './context';\n\nconst STYLES_LIST = [\n ...BASE_STYLES,\n ...DIMENSION_STYLES,\n ...BLOCK_STYLES,\n ...FLOW_STYLES,\n];\n\nconst DialogElement = tasty({\n as: 'section',\n styles: {\n display: 'flex',\n flow: 'column',\n fill: '#surface',\n pointerEvents: 'auto',\n outline: 0,\n position: {\n '': 'relative',\n 'type=panel': 'absolute',\n },\n width: {\n '': '$min-dialog-size $dialog-size (100dvw - 8x)',\n 'type=fullscreen': '(100dvw - 8x) (100dvw - 8x)',\n 'type=fullscreenTakeover': '100dvw 100dvw',\n 'type=panel': 'auto',\n },\n height: {\n '': 'auto (100dvh - 8x)',\n 'type=fullscreen': '(100dvh - 8x) (100dvh - 8x)',\n 'type=fullscreenTakeover | type=panel': '100dvh 100dvh',\n 'type=popover': 'initial initial (50dvh - 5x)',\n },\n gap: 0,\n border: {\n '': false,\n 'type=popover': true,\n },\n radius: {\n '': '1cr',\n 'type=tray': '1cr top',\n 'type=fullscreenTakeover': '0r',\n },\n shadow: {\n '': '$dialog-shadow',\n 'type=popover | type=panel': '$shadow',\n },\n top: {\n '': false,\n 'type=modal': '((50vh - 50%) / -3)',\n 'type=panel': 'auto',\n },\n '$dialog-title-padding-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-content-padding-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-padding-h': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-footer-v': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n '$dialog-content-gap': {\n '': '1.5x',\n 'type=popover': '1x',\n },\n },\n});\n\nconst CloseButton = tasty(ItemButton, {\n qa: 'ModalCloseButton',\n type: 'clear',\n styles: {\n position: 'absolute',\n top: '1x',\n right: '1x',\n },\n});\n\nconst sizeMap = {\n S: 'small',\n M: 'medium',\n L: 'large',\n};\nconst sizePxMap = {\n small: 360,\n medium: 479,\n large: 798,\n};\n\nexport interface CubeDialogProps\n extends Omit<BaseProps, 'role'>,\n AriaDialogProps,\n BaseStyleProps,\n BlockStyleProps,\n DimensionStyleProps {\n /** The size of the dialog */\n size?: 'S' | 'M' | 'L' | 'small' | 'medium' | 'large';\n /** Whether the dialog is dismissable */\n isDismissable?: boolean;\n /** Trigger when the dialog is dismissed */\n onDismiss?: (arg?: any) => void;\n /** That you can replace the close icon with */\n closeIcon?: ReactElement;\n closeButtonStyles?: Styles;\n role?: 'dialog' | 'alertdialog';\n}\n\n/**\n * Dialogs are windows containing contextual information, tasks, or workflows that appear over the user interface.\n * Depending on the kind of Dialog, further interactions may be blocked until the Dialog is acknowledged.\n */\nexport const Dialog = forwardRef(function Dialog(\n props: CubeDialogProps,\n ref: Ref<HTMLDivElement>,\n) {\n const transitionContext = useOpenTransitionContext();\n\n const isEntered = transitionContext?.transitionState === 'entered';\n\n const context = useDialogContext();\n\n const content = useMemo(() => {\n return <DialogContent key=\"content\" {...props} ref={ref} />;\n }, [props, ref]);\n\n const shouldContainFocus =\n isEntered && !!context.isOpen && context.type !== 'panel';\n\n return (\n // This component traps the focus inside the dialog and restores it on close.\n <FocusScope restoreFocus contain={shouldContainFocus}>\n {content}\n </FocusScope>\n );\n});\n\nconst DialogContent = forwardRef(function DialogContent(\n props: CubeDialogProps,\n ref: Ref<HTMLDivElement>,\n) {\n let { type = 'modal', ...contextProps } = useDialogContext();\n\n let {\n qa,\n children,\n size = 'M',\n isDismissable = contextProps.isDismissable,\n onDismiss = contextProps.onClose,\n closeIcon,\n closeButtonStyles,\n style,\n ...otherProps\n } = props;\n\n size = sizeMap[size.toUpperCase()] || size;\n\n const styles: Styles = extractStyles(otherProps, STYLES_LIST);\n\n const { t } = useI18n();\n\n let domRef = useObjectRef(ref);\n let { dialogProps, titleProps } = useDialog(\n mergeProps(contextProps, props),\n domRef,\n );\n\n // If rendered in a popover or tray there won't be a visible dismiss button,\n // so we render a hidden one for screen readers.\n let dismissButton;\n if (type === 'popover' || type === 'tray') {\n dismissButton = <DismissButton onDismiss={onDismiss} />;\n }\n\n // Focus the first focusable element in the dialog when it opens.\n //\n // We also re-run the priority focus logic when the dialog <section>\n // itself is the active element. This recovers from a race that occurs\n // when a popover-based component (FilterPicker, Picker, Select, …) opens\n // inside another contained Dialog: React's native `autoFocus` on the\n // inner control fires during the mutation phase, before the popover's\n // FocusScope registers in react-aria's focus-scope tree, so the outer\n // FocusScope yanks focus back. useDialog then defaults focus to the\n // dialog <section>; without re-promoting it here, the priority element\n // (e.g. the search input) is never focused.\n useEffect(() => {\n if (contextProps.isOpen) {\n setTimeout(() => {\n if (!domRef.current) return;\n\n const activeElement = document.activeElement;\n const isFocusOutsideDialog = !domRef.current.contains(activeElement);\n const isFocusOnDialogShell = activeElement === domRef.current;\n\n // Priority 1: autofocus input or primary button\n const priorityElement = domRef.current.querySelector(\n 'input[data-autofocus], button[type=\"submit\"], button[data-type=\"primary\"]',\n ) as HTMLElement | null;\n\n if (priorityElement && (isFocusOutsideDialog || isFocusOnDialogShell)) {\n priorityElement.focus();\n return;\n }\n\n if (isFocusOutsideDialog) {\n // Fallback: focus first tabbable element, or dialog itself\n const focusManager = createFocusManager(domRef);\n\n if (!focusManager.focusFirst({ tabbable: true })) {\n domRef.current.focus();\n }\n }\n });\n }\n }, [contextProps.isOpen]);\n\n // let hasHeader = useHasChild('[data-id=\"Header\"]', domRef);\n // let hasFooter = useHasChild('[data-id=\"Footer\"]', domRef);\n\n let slots = {\n title: {\n level: 2,\n preset: 'h4',\n ...titleProps,\n },\n content: {\n styles: {\n flexGrow: 1,\n padding: '$dialog-content-padding-v $dialog-padding-h',\n gap: '$dialog-content-gap',\n height: {\n '': 'max (100% - (2 * $dialog-content-padding-v))',\n ':last-child': 'max (100% - $dialog-content-padding-v)',\n },\n },\n },\n header: {\n ellipsis: true,\n styles: {\n display: 'flex',\n flow: 'row',\n gap: '1x',\n placeItems: 'center stretch',\n placeContent: 'space-between',\n padding: `$dialog-title-padding-v ${\n isDismissable ? '($dialog-padding-h + 4x)' : '$dialog-padding-h'\n } $dialog-title-padding-v $dialog-padding-h`,\n border: 'bottom',\n },\n },\n footer: {\n styles: {\n display: 'flex',\n gap: '1x',\n flow: 'row-reverse',\n placeItems: 'baseline stretch',\n placeContent: 'space-between',\n padding: '$dialog-footer-v $dialog-padding-h',\n },\n },\n buttonGroup: {\n styles: {\n flow: 'row-reverse',\n },\n },\n };\n\n return (\n <DialogElement\n ref={domRef}\n data-id=\"Dialog\"\n data-qa={qa || 'Dialog'}\n styles={styles}\n as=\"section\"\n {...dialogProps}\n mods={{ dismissable: isDismissable }}\n style={{\n '--dialog-size': `${sizePxMap[size] || sizePxMap.small}px`,\n ...style,\n }}\n data-type={type}\n data-size={size}\n >\n {dismissButton}\n\n <SlotProvider slots={slots}>\n {isDismissable && (\n <CloseButton\n icon={closeIcon || <CloseIcon size={20} />}\n label={t('dialog.dismiss', 'Dismiss')}\n onPress={() => onDismiss && onDismiss()}\n />\n )}\n {children}\n </SlotProvider>\n </DialogElement>\n );\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { _Modal } from "../Modal/Modal.js";
3
3
  import { DialogContext } from "./context.js";
4
4
  import { Children, isValidElement, useRef } from "react";
@@ -1,5 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { _Title } from "../../content/Title.js";
3
+ import { useI18n } from "../../../i18n/useI18n.js";
3
4
  import { ButtonGroup } from "../../actions/ButtonGroup/ButtonGroup.js";
4
5
  import { Button } from "../../actions/index.js";
5
6
  import { useDialogContext } from "./context.js";
@@ -18,6 +19,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
18
19
  function DialogForm(props) {
19
20
  let { qa, name, form, defaultValues, onDismiss, onSubmit, onSubmitFailed, onValuesChange, labelStyles, labelPosition, requiredMark, necessityIndicator, necessityLabel, isReadOnly, validationState, validateTrigger, children, danger, noActions, submitProps, cancelProps, preserve, title, size, closeIcon, ...dialogProps } = props;
20
21
  [form] = useForm(form);
22
+ const { t } = useI18n();
21
23
  const { onClose } = useDialogContext();
22
24
  function onLocalDismiss() {
23
25
  onClose?.();
@@ -59,11 +61,11 @@ function DialogForm(props) {
59
61
  children: [typeof children === "function" ? children(onLocalDismiss) : children, !noActions ? /* @__PURE__ */ jsxs(ButtonGroup, { children: [/* @__PURE__ */ jsx(_SubmitButton, {
60
62
  qa: `${qa || ""}SubmitButton`,
61
63
  theme: danger ? "danger" : void 0,
62
- label: "Submit",
64
+ label: t("dialogForm.submit", "Submit"),
63
65
  ...submitProps || {}
64
66
  }), /* @__PURE__ */ jsx(Button, {
65
67
  qa: `${qa || ""}CancelButton`,
66
- label: "Cancel",
68
+ label: t("dialogForm.cancel", "Cancel"),
67
69
  onPress: onLocalDismiss,
68
70
  ...cancelProps || {}
69
71
  })] }) : void 0]
@@ -1 +1 @@
1
- {"version":3,"file":"DialogForm.js","names":["Title","SubmitButton"],"sources":["../../../../src/components/overlays/Dialog/DialogForm.tsx"],"sourcesContent":["import { Button, ButtonGroup, CubeButtonProps } from '../../actions';\nimport { Content } from '../../content/Content';\nimport { Header } from '../../content/Header';\nimport { Title } from '../../content/Title';\nimport {\n CubeFormProps,\n FieldTypes,\n Form,\n SubmitButton,\n useForm,\n} from '../../form';\n\nimport { useDialogContext } from './context';\nimport { CubeDialogProps, Dialog } from './Dialog';\n\nexport interface CubeDialogFormProps<T extends FieldTypes = FieldTypes>\n extends Omit<CubeDialogProps, 'children'>,\n Omit<CubeFormProps<T>, 'role' | 'children'> {\n /** Whether the submit button has a `danger` theme */\n danger?: boolean;\n /** Properties for submit button. Use `label` to change text. */\n submitProps?: CubeButtonProps;\n /** Properties for cancel button. Use `label` to change text. */\n cancelProps?: CubeButtonProps;\n /** WIP. Preserve form values even if field is deleted */\n preserve?: boolean;\n /** Whether to hide action button so developer can manually specify them */\n noActions?: boolean;\n /** The title of the dialog */\n title?: string;\n /** Children nodes or render function */\n children?:\n | CubeFormProps['children']\n | ((onLocalDismiss: () => void) => CubeFormProps['children']);\n}\n\nexport interface CubeDialogFormRef {\n open: () => void;\n close: () => void;\n}\n\n/**\n * DialogForms are a specific type of Dialog. They contain forms to fill.\n */\nexport function DialogForm<T extends FieldTypes = FieldTypes>(\n props: CubeDialogFormProps<T>,\n) {\n let {\n qa,\n name,\n form,\n defaultValues,\n onDismiss,\n onSubmit,\n onSubmitFailed,\n onValuesChange,\n labelStyles,\n labelPosition,\n requiredMark,\n necessityIndicator,\n necessityLabel,\n isReadOnly,\n validationState,\n validateTrigger,\n children,\n danger,\n noActions,\n submitProps,\n cancelProps,\n preserve,\n title,\n size,\n closeIcon,\n ...dialogProps\n } = props;\n\n [form] = useForm(form);\n\n const { onClose } = useDialogContext();\n\n function onLocalDismiss() {\n onClose?.();\n onDismiss?.();\n\n if (!preserve) {\n // let animations finish before resetting the form\n setTimeout(() => {\n form?.resetFields();\n }, 250);\n }\n }\n\n return (\n <Dialog\n qa={`${qa || ''}Dialog`}\n size={size}\n closeIcon={closeIcon}\n {...dialogProps}\n >\n <Header>\n <Title ellipsis>{title}</Title>\n </Header>\n <Content>\n <Form<T>\n qa={qa || 'DialogForm'}\n form={form}\n name={name}\n defaultValues={defaultValues}\n labelStyles={labelStyles}\n labelPosition={labelPosition}\n requiredMark={requiredMark}\n necessityIndicator={necessityIndicator}\n necessityLabel={necessityLabel}\n isReadOnly={isReadOnly}\n validationState={validationState}\n validateTrigger={validateTrigger}\n onSubmit={async (data) => {\n await onSubmit?.(data);\n\n onClose?.();\n\n if (!preserve) {\n // let animations finish before resetting the form\n setTimeout(() => {\n form.resetFields();\n }, 250);\n }\n }}\n onSubmitFailed={onSubmitFailed}\n onValuesChange={onValuesChange}\n >\n {typeof children === 'function' ? children(onLocalDismiss) : children}\n\n {!noActions ? (\n <ButtonGroup>\n <SubmitButton\n qa={`${qa || ''}SubmitButton`}\n theme={danger ? 'danger' : undefined}\n label=\"Submit\"\n {...(submitProps || {})}\n />\n <Button\n qa={`${qa || ''}CancelButton`}\n label=\"Cancel\"\n onPress={onLocalDismiss}\n {...(cancelProps || {})}\n />\n </ButtonGroup>\n ) : undefined}\n </Form>\n </Content>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4CA,SAAgB,WACd,OACA;CACA,IAAI,EACF,IACA,MACA,MACA,eACA,WACA,UACA,gBACA,gBACA,aACA,eACA,cACA,oBACA,gBACA,YACA,iBACA,iBACA,UACA,QACA,WACA,aACA,aACA,UACA,OACA,MACA,WACA,GAAG,gBACD;AAEJ,EAAC,QAAQ,QAAQ,KAAK;CAEtB,MAAM,EAAE,YAAY,kBAAkB;CAEtC,SAAS,iBAAiB;AACxB,aAAW;AACX,eAAa;AAEb,MAAI,CAAC,SAEH,kBAAiB;AACf,SAAM,aAAa;KAClB,IAAI;;AAIX,QACE,qBAAC;EACC,IAAI,GAAG,MAAM,GAAG;EACV;EACK;EACX,GAAI;aAEJ,oBAAC,oBACC,oBAACA;GAAM;aAAU;IAAc,GACxB,EACT,oBAAC,qBACC,qBAAC;GACC,IAAI,MAAM;GACJ;GACA;GACS;GACF;GACE;GACD;GACM;GACJ;GACJ;GACK;GACA;GACjB,UAAU,OAAO,SAAS;AACxB,UAAM,WAAW,KAAK;AAEtB,eAAW;AAEX,QAAI,CAAC,SAEH,kBAAiB;AACf,UAAK,aAAa;OACjB,IAAI;;GAGK;GACA;cAEf,OAAO,aAAa,aAAa,SAAS,eAAe,GAAG,UAE5D,CAAC,YACA,qBAAC,0BACC,oBAACC;IACC,IAAI,GAAG,MAAM,GAAG;IAChB,OAAO,SAAS,WAAW;IAC3B,OAAM;IACN,GAAK,eAAe,EAAE;KACtB,EACF,oBAAC;IACC,IAAI,GAAG,MAAM,GAAG;IAChB,OAAM;IACN,SAAS;IACT,GAAK,eAAe,EAAE;KACtB,IACU,GACZ;IACC,GACC;GACH"}
1
+ {"version":3,"file":"DialogForm.js","names":["Title","SubmitButton"],"sources":["../../../../src/components/overlays/Dialog/DialogForm.tsx"],"sourcesContent":["import { useI18n } from '../../../i18n';\nimport { Button, ButtonGroup, CubeButtonProps } from '../../actions';\nimport { Content } from '../../content/Content';\nimport { Header } from '../../content/Header';\nimport { Title } from '../../content/Title';\nimport {\n CubeFormProps,\n FieldTypes,\n Form,\n SubmitButton,\n useForm,\n} from '../../form';\n\nimport { useDialogContext } from './context';\nimport { CubeDialogProps, Dialog } from './Dialog';\n\nexport interface CubeDialogFormProps<T extends FieldTypes = FieldTypes>\n extends Omit<CubeDialogProps, 'children'>,\n Omit<CubeFormProps<T>, 'role' | 'children'> {\n /** Whether the submit button has a `danger` theme */\n danger?: boolean;\n /** Properties for submit button. Use `label` to change text. */\n submitProps?: CubeButtonProps;\n /** Properties for cancel button. Use `label` to change text. */\n cancelProps?: CubeButtonProps;\n /** WIP. Preserve form values even if field is deleted */\n preserve?: boolean;\n /** Whether to hide action button so developer can manually specify them */\n noActions?: boolean;\n /** The title of the dialog */\n title?: string;\n /** Children nodes or render function */\n children?:\n | CubeFormProps['children']\n | ((onLocalDismiss: () => void) => CubeFormProps['children']);\n}\n\nexport interface CubeDialogFormRef {\n open: () => void;\n close: () => void;\n}\n\n/**\n * DialogForms are a specific type of Dialog. They contain forms to fill.\n */\nexport function DialogForm<T extends FieldTypes = FieldTypes>(\n props: CubeDialogFormProps<T>,\n) {\n let {\n qa,\n name,\n form,\n defaultValues,\n onDismiss,\n onSubmit,\n onSubmitFailed,\n onValuesChange,\n labelStyles,\n labelPosition,\n requiredMark,\n necessityIndicator,\n necessityLabel,\n isReadOnly,\n validationState,\n validateTrigger,\n children,\n danger,\n noActions,\n submitProps,\n cancelProps,\n preserve,\n title,\n size,\n closeIcon,\n ...dialogProps\n } = props;\n\n [form] = useForm(form);\n\n const { t } = useI18n();\n const { onClose } = useDialogContext();\n\n function onLocalDismiss() {\n onClose?.();\n onDismiss?.();\n\n if (!preserve) {\n // let animations finish before resetting the form\n setTimeout(() => {\n form?.resetFields();\n }, 250);\n }\n }\n\n return (\n <Dialog\n qa={`${qa || ''}Dialog`}\n size={size}\n closeIcon={closeIcon}\n {...dialogProps}\n >\n <Header>\n <Title ellipsis>{title}</Title>\n </Header>\n <Content>\n <Form<T>\n qa={qa || 'DialogForm'}\n form={form}\n name={name}\n defaultValues={defaultValues}\n labelStyles={labelStyles}\n labelPosition={labelPosition}\n requiredMark={requiredMark}\n necessityIndicator={necessityIndicator}\n necessityLabel={necessityLabel}\n isReadOnly={isReadOnly}\n validationState={validationState}\n validateTrigger={validateTrigger}\n onSubmit={async (data) => {\n await onSubmit?.(data);\n\n onClose?.();\n\n if (!preserve) {\n // let animations finish before resetting the form\n setTimeout(() => {\n form.resetFields();\n }, 250);\n }\n }}\n onSubmitFailed={onSubmitFailed}\n onValuesChange={onValuesChange}\n >\n {typeof children === 'function' ? children(onLocalDismiss) : children}\n\n {!noActions ? (\n <ButtonGroup>\n <SubmitButton\n qa={`${qa || ''}SubmitButton`}\n theme={danger ? 'danger' : undefined}\n label={t('dialogForm.submit', 'Submit')}\n {...(submitProps || {})}\n />\n <Button\n qa={`${qa || ''}CancelButton`}\n label={t('dialogForm.cancel', 'Cancel')}\n onPress={onLocalDismiss}\n {...(cancelProps || {})}\n />\n </ButtonGroup>\n ) : undefined}\n </Form>\n </Content>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA6CA,SAAgB,WACd,OACA;CACA,IAAI,EACF,IACA,MACA,MACA,eACA,WACA,UACA,gBACA,gBACA,aACA,eACA,cACA,oBACA,gBACA,YACA,iBACA,iBACA,UACA,QACA,WACA,aACA,aACA,UACA,OACA,MACA,WACA,GAAG,gBACD;AAEJ,EAAC,QAAQ,QAAQ,KAAK;CAEtB,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,EAAE,YAAY,kBAAkB;CAEtC,SAAS,iBAAiB;AACxB,aAAW;AACX,eAAa;AAEb,MAAI,CAAC,SAEH,kBAAiB;AACf,SAAM,aAAa;KAClB,IAAI;;AAIX,QACE,qBAAC;EACC,IAAI,GAAG,MAAM,GAAG;EACV;EACK;EACX,GAAI;aAEJ,oBAAC,oBACC,oBAACA;GAAM;aAAU;IAAc,GACxB,EACT,oBAAC,qBACC,qBAAC;GACC,IAAI,MAAM;GACJ;GACA;GACS;GACF;GACE;GACD;GACM;GACJ;GACJ;GACK;GACA;GACjB,UAAU,OAAO,SAAS;AACxB,UAAM,WAAW,KAAK;AAEtB,eAAW;AAEX,QAAI,CAAC,SAEH,kBAAiB;AACf,UAAK,aAAa;OACjB,IAAI;;GAGK;GACA;cAEf,OAAO,aAAa,aAAa,SAAS,eAAe,GAAG,UAE5D,CAAC,YACA,qBAAC,0BACC,oBAACC;IACC,IAAI,GAAG,MAAM,GAAG;IAChB,OAAO,SAAS,WAAW;IAC3B,OAAO,EAAE,qBAAqB,SAAS;IACvC,GAAK,eAAe,EAAE;KACtB,EACF,oBAAC;IACC,IAAI,GAAG,MAAM,GAAG;IAChB,OAAO,EAAE,qBAAqB,SAAS;IACvC,SAAS;IACT,GAAK,eAAe,EAAE;KACtB,IACU,GACZ;IACC,GACC;GACH"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { usePopoverSync } from "../../../utils/react/usePopoverSync.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { createContext, useContext } from "react";
3
3
  import invariant from "tiny-invariant";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { mergeProps } from "../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { DialogContainer } from "./DialogContainer.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { _Overlay } from "./Overlay.js";
4
4
  import { _Underlay } from "./Underlay.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { createContext, useContext } from "react";
3
3
 
4
4
  //#region src/components/overlays/Modal/OpenTransitionContext.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { DisplayTransition } from "../../helpers/DisplayTransition/DisplayTransition.js";
3
3
  import { Provider, useProviderProps } from "../../../provider.js";
4
4
  import { OpenTransitionContext } from "./OpenTransitionContext.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { _Overlay } from "./Overlay.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { _Overlay } from "./Overlay.js";
4
4
  import { _Underlay } from "./Underlay.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { tasty } from "@tenphi/tasty";
3
3
  import { forwardRef } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useNotificationContext } from "./NotificationContext.js";
3
3
  import { useEffect, useRef } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
4
4
  import { createContext, useContext, useMemo } from "react";
@@ -1,8 +1,9 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { Block } from "../../Block.js";
3
3
  import { ItemActionProvider } from "../../actions/ItemActionContext.js";
4
4
  import { Space } from "../../layout/Space.js";
5
5
  import { _Item } from "../../content/Item/Item.js";
6
+ import { useI18n } from "../../../i18n/useI18n.js";
6
7
  import { getThemeIcon } from "../Toast/useToast.js";
7
8
  import { Flex } from "../../layout/Flex.js";
8
9
  import { NotificationAction, NotificationDismissProvider } from "./NotificationAction.js";
@@ -60,9 +61,10 @@ function hasDismissAction(node) {
60
61
  * via `hasDismissAction(actions)` — this component always renders the button.
61
62
  */
62
63
  function AutoDismissButton() {
64
+ const { t } = useI18n();
63
65
  return /* @__PURE__ */ jsx(NotificationAction, {
64
66
  isDismiss: true,
65
- children: "Dismiss"
67
+ children: t("notifications.dismiss", "Dismiss")
66
68
  });
67
69
  }
68
70
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationCard.js","names":["Item"],"sources":["../../../../src/components/overlays/Notifications/NotificationCard.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { isValidElement, Key, ReactNode } from 'react';\n\nimport { ItemActionProvider } from '../../actions/ItemActionContext';\nimport { Block } from '../../Block';\nimport { Item } from '../../content/Item/Item';\nimport { Flex } from '../../layout/Flex';\nimport { Space } from '../../layout/Space';\nimport { getThemeIcon } from '../Toast/useToast';\n\nimport {\n NotificationAction,\n NotificationDismissProvider,\n} from './NotificationAction';\n\nimport type { DismissReason, NotificationType } from './types';\n\n// ─── Styled Components ──────────────────────────────────────────────\n\nconst StyledItem = tasty(Item, {\n styles: {\n width: {\n '': 'max min((100vw - 4x), 50x)',\n flat: '100%',\n },\n shadow: {\n '': '$shadow',\n flat: false,\n },\n radius: {\n '': '1cr',\n flat: '0',\n },\n transition: 'theme, inset',\n\n Description: {\n preset: 't4',\n },\n },\n});\n\n// ─── Dismiss Action Detection ────────────────────────────────────────\n\n/**\n * Deterministically checks whether any `NotificationAction` with `isDismiss`\n * is present in the `actions` ReactNode tree.\n *\n * Walks the static element tree (arrays, fragments, host elements, and\n * composite wrappers via their `children` prop) instead of relying on\n * render-phase ref mutation, so suppression does not depend on sibling render\n * order or concurrent rendering timing.\n */\nfunction hasDismissAction(node: ReactNode): boolean {\n let found = false;\n\n const visit = (n: ReactNode) => {\n if (found || n == null || typeof n === 'boolean' || typeof n === 'string') {\n return;\n }\n\n if (Array.isArray(n)) {\n for (const child of n) visit(child);\n return;\n }\n\n if (isValidElement(n)) {\n if (n.type === NotificationAction && (n.props as any).isDismiss) {\n found = true;\n return;\n }\n\n // Recurse into any wrapper's children (fragments, host elements like\n // `div`, and composite wrappers like `Flex` that receive the actions as\n // children). Note: a component that creates the NotificationAction\n // internally rather than receiving it via children cannot be detected\n // statically.\n visit((n.props as any).children);\n }\n };\n\n visit(node);\n return found;\n}\n\n/**\n * Renders the default \"Dismiss\" button. Suppression is decided by the caller\n * via `hasDismissAction(actions)` — this component always renders the button.\n */\nfunction AutoDismissButton() {\n return <NotificationAction isDismiss>Dismiss</NotificationAction>;\n}\n\n// ─── ActionsSection ─────────────────────────────────────────────────\n\ninterface ActionsSectionProps {\n actions?: ReactNode;\n theme?: NotificationType;\n /**\n * Whether to show the auto-appended \"Dismiss\" button.\n * Controlled by `isDismissable` on the notification.\n *\n * When false, no default \"Dismiss\" button is rendered, but actions with\n * `closeOnPress` (default `true`) can still close the notification via\n * the dismiss context.\n */\n showAutoDismiss: boolean;\n /** Whether the dismiss context is available (notificationId + onDismiss present) */\n hasDismissContext: boolean;\n notificationId?: Key;\n onDismiss?: (id: Key, reason: DismissReason) => void;\n onRestore?: (id: Key) => void;\n}\n\n/**\n * Extracted sub-component for the actions area of a notification card.\n *\n * The dismiss provider is always rendered when `hasDismissContext` is true,\n * so any action with `closeOnPress` can close the notification — regardless\n * of `isDismissable`. The `showAutoDismiss` flag only controls the\n * auto-appended \"Dismiss\" button.\n */\nfunction ActionsSection({\n actions,\n theme,\n showAutoDismiss,\n hasDismissContext,\n notificationId,\n onDismiss,\n onRestore,\n}: ActionsSectionProps) {\n // Suppress the auto-appended \"Dismiss\" when any provided action is already\n // marked `isDismiss`. Determined statically from the element tree so it does\n // not depend on render order or concurrent rendering timing.\n const hasDismiss = hasDismissAction(actions);\n const showDefaultDismiss = showAutoDismiss && !hasDismiss;\n\n const actionsContent = (\n <Space placeSelf=\"end\" placeContent=\"end\" flexGrow={1}>\n {actions}\n {showDefaultDismiss && <AutoDismissButton />}\n </Space>\n );\n\n return (\n <ItemActionProvider type=\"card\" theme={theme}>\n {hasDismissContext ? (\n <NotificationDismissProvider\n notificationId={notificationId!}\n onDismiss={onDismiss!}\n onRestore={onRestore}\n >\n {actionsContent}\n </NotificationDismissProvider>\n ) : (\n actionsContent\n )}\n </ItemActionProvider>\n );\n}\n\n// ─── NotificationCard ────────────────────────────────────────────────\n\nexport interface NotificationCardProps {\n qa?: string;\n /** Notification theme */\n theme?: NotificationType;\n /** Primary text */\n title?: ReactNode;\n /** Secondary text */\n description?: ReactNode;\n /** Custom icon override (theme default used if omitted) */\n icon?: ReactNode;\n /** Action buttons rendered below description */\n actions?: ReactNode;\n /**\n * Whether the notification shows the default dismiss UI (auto-appended\n * \"Dismiss\" button and Escape key). Default: true.\n *\n * When false, no default \"Dismiss\" button is rendered and Escape does\n * nothing, but actions with `closeOnPress` (default) can still close\n * the notification.\n */\n isDismissable?: boolean;\n /** When false the card drops its shadow (e.g. inside a list). Default: true. */\n elevated?: boolean;\n /** Notification id */\n notificationId?: Key;\n /** Called when the notification is dismissed */\n onDismiss?: (id: Key, reason: DismissReason) => void;\n /** Called when a dismissed notification should be restored (async action returned false) */\n onRestore?: (id: Key) => void;\n /** Suffix content (e.g. timestamp) */\n suffix?: ReactNode;\n}\n\n/**\n * Shared presentational card used by both overlay NotificationItem\n * and PersistentNotificationListItem.\n */\nexport function NotificationCard({\n qa = 'Notification',\n theme,\n title,\n description,\n icon: providedIcon,\n actions,\n isDismissable = true,\n elevated = true,\n notificationId,\n onDismiss,\n onRestore,\n suffix,\n}: NotificationCardProps) {\n const icon = getThemeIcon(theme, providedIcon);\n\n const hasDismissContext = notificationId != null && onDismiss != null;\n const showAutoDismiss = isDismissable && hasDismissContext;\n const hasActions = !!(actions || showAutoDismiss);\n\n const descriptionContent: ReactNode =\n description || hasActions ? (\n <Flex flow=\"row wrap\" gap=\"0.5x 1x\" placeItems=\"center stretch\">\n {description && <Block>{description}</Block>}\n {hasActions && (\n <ActionsSection\n actions={actions}\n theme={theme}\n showAutoDismiss={showAutoDismiss}\n hasDismissContext={hasDismissContext}\n notificationId={notificationId}\n onDismiss={onDismiss}\n onRestore={onRestore}\n />\n )}\n </Flex>\n ) : undefined;\n\n return (\n <StyledItem\n qa={qa}\n type=\"card\"\n theme={theme}\n icon={icon}\n description={descriptionContent}\n suffix={suffix}\n mods={{ flat: !elevated }}\n styles={!elevated ? { border: '0' } : undefined}\n >\n {title}\n </StyledItem>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,MAAM,aAAa,MAAMA,OAAM,EAC7B,QAAQ;CACN,OAAO;EACL,IAAI;EACJ,MAAM;EACP;CACD,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACD,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACD,YAAY;CAEZ,aAAa,EACX,QAAQ,MACT;CACF,EACF,CAAC;;;;;;;;;;AAaF,SAAS,iBAAiB,MAA0B;CAClD,IAAI,QAAQ;CAEZ,MAAM,SAAS,MAAiB;AAC9B,MAAI,SAAS,KAAK,QAAQ,OAAO,MAAM,aAAa,OAAO,MAAM,SAC/D;AAGF,MAAI,MAAM,QAAQ,EAAE,EAAE;AACpB,QAAK,MAAM,SAAS,EAAG,OAAM,MAAM;AACnC;;AAGF,MAAI,eAAe,EAAE,EAAE;AACrB,OAAI,EAAE,SAAS,sBAAuB,EAAE,MAAc,WAAW;AAC/D,YAAQ;AACR;;AAQF,SAAO,EAAE,MAAc,SAAS;;;AAIpC,OAAM,KAAK;AACX,QAAO;;;;;;AAOT,SAAS,oBAAoB;AAC3B,QAAO,oBAAC;EAAmB;YAAU;GAA4B;;;;;;;;;;AAgCnE,SAAS,eAAe,EACtB,SACA,OACA,iBACA,mBACA,gBACA,WACA,aACsB;CAItB,MAAM,aAAa,iBAAiB,QAAQ;CAG5C,MAAM,iBACJ,qBAAC;EAAM,WAAU;EAAM,cAAa;EAAM,UAAU;aACjD,SAJsB,mBAAmB,CAAC,cAKpB,oBAAC,sBAAoB;GACtC;AAGV,QACE,oBAAC;EAAmB,MAAK;EAAc;YACpC,oBACC,oBAAC;GACiB;GACL;GACA;aAEV;IAC2B,GAE9B;GAEiB;;;;;;AA2CzB,SAAgB,iBAAiB,EAC/B,KAAK,gBACL,OACA,OACA,aACA,MAAM,cACN,SACA,gBAAgB,MAChB,WAAW,MACX,gBACA,WACA,WACA,UACwB;CACxB,MAAM,OAAO,aAAa,OAAO,aAAa;CAE9C,MAAM,oBAAoB,kBAAkB,QAAQ,aAAa;CACjE,MAAM,kBAAkB,iBAAiB;CACzC,MAAM,aAAa,CAAC,EAAE,WAAW;AAoBjC,QACE,oBAAC;EACK;EACJ,MAAK;EACE;EACD;EACN,aAvBF,eAAe,aACb,qBAAC;GAAK,MAAK;GAAW,KAAI;GAAU,YAAW;cAC5C,eAAe,oBAAC,mBAAO,cAAoB,EAC3C,cACC,oBAAC;IACU;IACF;IACU;IACE;IACH;IACL;IACA;KACX;IAEC,GACL;EASM;EACR,MAAM,EAAE,MAAM,CAAC,UAAU;EACzB,QAAQ,CAAC,WAAW,EAAE,QAAQ,KAAK,GAAG;YAErC;GACU"}
1
+ {"version":3,"file":"NotificationCard.js","names":["Item"],"sources":["../../../../src/components/overlays/Notifications/NotificationCard.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { isValidElement, Key, ReactNode } from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { ItemActionProvider } from '../../actions/ItemActionContext';\nimport { Block } from '../../Block';\nimport { Item } from '../../content/Item/Item';\nimport { Flex } from '../../layout/Flex';\nimport { Space } from '../../layout/Space';\nimport { getThemeIcon } from '../Toast/useToast';\n\nimport {\n NotificationAction,\n NotificationDismissProvider,\n} from './NotificationAction';\n\nimport type { DismissReason, NotificationType } from './types';\n\n// ─── Styled Components ──────────────────────────────────────────────\n\nconst StyledItem = tasty(Item, {\n styles: {\n width: {\n '': 'max min((100vw - 4x), 50x)',\n flat: '100%',\n },\n shadow: {\n '': '$shadow',\n flat: false,\n },\n radius: {\n '': '1cr',\n flat: '0',\n },\n transition: 'theme, inset',\n\n Description: {\n preset: 't4',\n },\n },\n});\n\n// ─── Dismiss Action Detection ────────────────────────────────────────\n\n/**\n * Deterministically checks whether any `NotificationAction` with `isDismiss`\n * is present in the `actions` ReactNode tree.\n *\n * Walks the static element tree (arrays, fragments, host elements, and\n * composite wrappers via their `children` prop) instead of relying on\n * render-phase ref mutation, so suppression does not depend on sibling render\n * order or concurrent rendering timing.\n */\nfunction hasDismissAction(node: ReactNode): boolean {\n let found = false;\n\n const visit = (n: ReactNode) => {\n if (found || n == null || typeof n === 'boolean' || typeof n === 'string') {\n return;\n }\n\n if (Array.isArray(n)) {\n for (const child of n) visit(child);\n return;\n }\n\n if (isValidElement(n)) {\n if (n.type === NotificationAction && (n.props as any).isDismiss) {\n found = true;\n return;\n }\n\n // Recurse into any wrapper's children (fragments, host elements like\n // `div`, and composite wrappers like `Flex` that receive the actions as\n // children). Note: a component that creates the NotificationAction\n // internally rather than receiving it via children cannot be detected\n // statically.\n visit((n.props as any).children);\n }\n };\n\n visit(node);\n return found;\n}\n\n/**\n * Renders the default \"Dismiss\" button. Suppression is decided by the caller\n * via `hasDismissAction(actions)` — this component always renders the button.\n */\nfunction AutoDismissButton() {\n const { t } = useI18n();\n\n return (\n <NotificationAction isDismiss>\n {t('notifications.dismiss', 'Dismiss')}\n </NotificationAction>\n );\n}\n\n// ─── ActionsSection ─────────────────────────────────────────────────\n\ninterface ActionsSectionProps {\n actions?: ReactNode;\n theme?: NotificationType;\n /**\n * Whether to show the auto-appended \"Dismiss\" button.\n * Controlled by `isDismissable` on the notification.\n *\n * When false, no default \"Dismiss\" button is rendered, but actions with\n * `closeOnPress` (default `true`) can still close the notification via\n * the dismiss context.\n */\n showAutoDismiss: boolean;\n /** Whether the dismiss context is available (notificationId + onDismiss present) */\n hasDismissContext: boolean;\n notificationId?: Key;\n onDismiss?: (id: Key, reason: DismissReason) => void;\n onRestore?: (id: Key) => void;\n}\n\n/**\n * Extracted sub-component for the actions area of a notification card.\n *\n * The dismiss provider is always rendered when `hasDismissContext` is true,\n * so any action with `closeOnPress` can close the notification — regardless\n * of `isDismissable`. The `showAutoDismiss` flag only controls the\n * auto-appended \"Dismiss\" button.\n */\nfunction ActionsSection({\n actions,\n theme,\n showAutoDismiss,\n hasDismissContext,\n notificationId,\n onDismiss,\n onRestore,\n}: ActionsSectionProps) {\n // Suppress the auto-appended \"Dismiss\" when any provided action is already\n // marked `isDismiss`. Determined statically from the element tree so it does\n // not depend on render order or concurrent rendering timing.\n const hasDismiss = hasDismissAction(actions);\n const showDefaultDismiss = showAutoDismiss && !hasDismiss;\n\n const actionsContent = (\n <Space placeSelf=\"end\" placeContent=\"end\" flexGrow={1}>\n {actions}\n {showDefaultDismiss && <AutoDismissButton />}\n </Space>\n );\n\n return (\n <ItemActionProvider type=\"card\" theme={theme}>\n {hasDismissContext ? (\n <NotificationDismissProvider\n notificationId={notificationId!}\n onDismiss={onDismiss!}\n onRestore={onRestore}\n >\n {actionsContent}\n </NotificationDismissProvider>\n ) : (\n actionsContent\n )}\n </ItemActionProvider>\n );\n}\n\n// ─── NotificationCard ────────────────────────────────────────────────\n\nexport interface NotificationCardProps {\n qa?: string;\n /** Notification theme */\n theme?: NotificationType;\n /** Primary text */\n title?: ReactNode;\n /** Secondary text */\n description?: ReactNode;\n /** Custom icon override (theme default used if omitted) */\n icon?: ReactNode;\n /** Action buttons rendered below description */\n actions?: ReactNode;\n /**\n * Whether the notification shows the default dismiss UI (auto-appended\n * \"Dismiss\" button and Escape key). Default: true.\n *\n * When false, no default \"Dismiss\" button is rendered and Escape does\n * nothing, but actions with `closeOnPress` (default) can still close\n * the notification.\n */\n isDismissable?: boolean;\n /** When false the card drops its shadow (e.g. inside a list). Default: true. */\n elevated?: boolean;\n /** Notification id */\n notificationId?: Key;\n /** Called when the notification is dismissed */\n onDismiss?: (id: Key, reason: DismissReason) => void;\n /** Called when a dismissed notification should be restored (async action returned false) */\n onRestore?: (id: Key) => void;\n /** Suffix content (e.g. timestamp) */\n suffix?: ReactNode;\n}\n\n/**\n * Shared presentational card used by both overlay NotificationItem\n * and PersistentNotificationListItem.\n */\nexport function NotificationCard({\n qa = 'Notification',\n theme,\n title,\n description,\n icon: providedIcon,\n actions,\n isDismissable = true,\n elevated = true,\n notificationId,\n onDismiss,\n onRestore,\n suffix,\n}: NotificationCardProps) {\n const icon = getThemeIcon(theme, providedIcon);\n\n const hasDismissContext = notificationId != null && onDismiss != null;\n const showAutoDismiss = isDismissable && hasDismissContext;\n const hasActions = !!(actions || showAutoDismiss);\n\n const descriptionContent: ReactNode =\n description || hasActions ? (\n <Flex flow=\"row wrap\" gap=\"0.5x 1x\" placeItems=\"center stretch\">\n {description && <Block>{description}</Block>}\n {hasActions && (\n <ActionsSection\n actions={actions}\n theme={theme}\n showAutoDismiss={showAutoDismiss}\n hasDismissContext={hasDismissContext}\n notificationId={notificationId}\n onDismiss={onDismiss}\n onRestore={onRestore}\n />\n )}\n </Flex>\n ) : undefined;\n\n return (\n <StyledItem\n qa={qa}\n type=\"card\"\n theme={theme}\n icon={icon}\n description={descriptionContent}\n suffix={suffix}\n mods={{ flat: !elevated }}\n styles={!elevated ? { border: '0' } : undefined}\n >\n {title}\n </StyledItem>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,aAAa,MAAMA,OAAM,EAC7B,QAAQ;CACN,OAAO;EACL,IAAI;EACJ,MAAM;EACP;CACD,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACD,QAAQ;EACN,IAAI;EACJ,MAAM;EACP;CACD,YAAY;CAEZ,aAAa,EACX,QAAQ,MACT;CACF,EACF,CAAC;;;;;;;;;;AAaF,SAAS,iBAAiB,MAA0B;CAClD,IAAI,QAAQ;CAEZ,MAAM,SAAS,MAAiB;AAC9B,MAAI,SAAS,KAAK,QAAQ,OAAO,MAAM,aAAa,OAAO,MAAM,SAC/D;AAGF,MAAI,MAAM,QAAQ,EAAE,EAAE;AACpB,QAAK,MAAM,SAAS,EAAG,OAAM,MAAM;AACnC;;AAGF,MAAI,eAAe,EAAE,EAAE;AACrB,OAAI,EAAE,SAAS,sBAAuB,EAAE,MAAc,WAAW;AAC/D,YAAQ;AACR;;AAQF,SAAO,EAAE,MAAc,SAAS;;;AAIpC,OAAM,KAAK;AACX,QAAO;;;;;;AAOT,SAAS,oBAAoB;CAC3B,MAAM,EAAE,MAAM,SAAS;AAEvB,QACE,oBAAC;EAAmB;YACjB,EAAE,yBAAyB,UAAU;GACnB;;;;;;;;;;AAiCzB,SAAS,eAAe,EACtB,SACA,OACA,iBACA,mBACA,gBACA,WACA,aACsB;CAItB,MAAM,aAAa,iBAAiB,QAAQ;CAG5C,MAAM,iBACJ,qBAAC;EAAM,WAAU;EAAM,cAAa;EAAM,UAAU;aACjD,SAJsB,mBAAmB,CAAC,cAKpB,oBAAC,sBAAoB;GACtC;AAGV,QACE,oBAAC;EAAmB,MAAK;EAAc;YACpC,oBACC,oBAAC;GACiB;GACL;GACA;aAEV;IAC2B,GAE9B;GAEiB;;;;;;AA2CzB,SAAgB,iBAAiB,EAC/B,KAAK,gBACL,OACA,OACA,aACA,MAAM,cACN,SACA,gBAAgB,MAChB,WAAW,MACX,gBACA,WACA,WACA,UACwB;CACxB,MAAM,OAAO,aAAa,OAAO,aAAa;CAE9C,MAAM,oBAAoB,kBAAkB,QAAQ,aAAa;CACjE,MAAM,kBAAkB,iBAAiB;CACzC,MAAM,aAAa,CAAC,EAAE,WAAW;AAoBjC,QACE,oBAAC;EACK;EACJ,MAAK;EACE;EACD;EACN,aAvBF,eAAe,aACb,qBAAC;GAAK,MAAK;GAAW,KAAI;GAAU,YAAW;cAC5C,eAAe,oBAAC,mBAAO,cAAoB,EAC3C,cACC,oBAAC;IACU;IACF;IACU;IACE;IACH;IACL;IACA;KACX;IAEC,GACL;EASM;EACR,MAAM,EAAE,MAAM,CAAC,UAAU;EACzB,QAAQ,CAAC,WAAW,EAAE,QAAQ,KAAK,GAAG;YAErC;GACU"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { createContext, useContext } from "react";
3
3
 
4
4
  //#region src/components/overlays/Notifications/NotificationContext.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { NotificationCard } from "./NotificationCard.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { DisplayTransition } from "../../helpers/DisplayTransition/DisplayTransition.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { NotificationContext, PersistentNotificationsContext, ToastContext, useNotificationContext, useToastContext } from "./NotificationContext.js";
3
3
  import { OverlayContainer } from "./OverlayContainer.js";
4
4
  import { useNotificationState } from "./use-notification-state.js";
@@ -1,6 +1,7 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { _Text } from "../../content/Text.js";
4
+ import { useI18n } from "../../../i18n/useI18n.js";
4
5
  import { NotificationActionInterceptorContext } from "./NotificationAction.js";
5
6
  import { NotificationCard } from "./NotificationCard.js";
6
7
  import { Divider } from "../../content/Divider.js";
@@ -17,7 +18,6 @@ const TIMESTAMP_REFRESH_INTERVAL = 1e4;
17
18
  const ListContainer = tasty({
18
19
  qa: "PersistentNotificationsList",
19
20
  role: "log",
20
- "aria-label": "Notifications",
21
21
  styles: {
22
22
  display: "flex",
23
23
  flow: "column"
@@ -49,7 +49,9 @@ const EmptyStateContainer = tasty({ styles: {
49
49
  * ```
50
50
  */
51
51
  function PersistentNotificationsList({ onDismissItem, onAction, emptyState }) {
52
+ const { t } = useI18n();
52
53
  const { items, remove, markAllAsRead } = usePersistentNotifications();
54
+ const listAriaLabel = t("notifications.ariaLabel", "Notifications");
53
55
  const handleDismiss = useEvent((item) => {
54
56
  remove(item.id);
55
57
  onDismissItem?.(item);
@@ -75,20 +77,27 @@ function PersistentNotificationsList({ onDismissItem, onAction, emptyState }) {
75
77
  }
76
78
  };
77
79
  }, [markAllAsRead, items]);
78
- if (items.length === 0) return /* @__PURE__ */ jsx(ListContainer, { children: /* @__PURE__ */ jsx(EmptyStateContainer, { children: emptyState ?? "No notifications" }) });
80
+ if (items.length === 0) return /* @__PURE__ */ jsx(ListContainer, {
81
+ "aria-label": listAriaLabel,
82
+ children: /* @__PURE__ */ jsx(EmptyStateContainer, { children: emptyState ?? t("notifications.empty", "No notifications") })
83
+ });
79
84
  return /* @__PURE__ */ jsx(NotificationActionInterceptorContext.Provider, {
80
85
  value: onAction ?? null,
81
- children: /* @__PURE__ */ jsx(ListContainer, { children: items.map((item, index) => /* @__PURE__ */ jsxs(Fragment, { children: [index > 0 && /* @__PURE__ */ jsx(Divider, {}), /* @__PURE__ */ jsx(PersistentNotificationListItem, {
82
- item,
83
- onDismiss: handleDismiss
84
- })] }, String(item.id))) })
86
+ children: /* @__PURE__ */ jsx(ListContainer, {
87
+ "aria-label": listAriaLabel,
88
+ children: items.map((item, index) => /* @__PURE__ */ jsxs(Fragment, { children: [index > 0 && /* @__PURE__ */ jsx(Divider, {}), /* @__PURE__ */ jsx(PersistentNotificationListItem, {
89
+ item,
90
+ onDismiss: handleDismiss
91
+ })] }, String(item.id)))
92
+ })
85
93
  });
86
94
  }
87
95
  function PersistentNotificationListItem({ item, onDismiss }) {
96
+ const { t } = useI18n();
88
97
  const suffix = /* @__PURE__ */ jsx(_Text, {
89
98
  opacity: .5,
90
99
  preset: "c2",
91
- children: formatRelativeTime(item.createdAt)
100
+ children: formatRelativeTime(item.createdAt, t)
92
101
  });
93
102
  const handleDismiss = useEvent((_id, _reason) => {
94
103
  onDismiss?.(item);
@@ -1 +1 @@
1
- {"version":3,"file":"PersistentNotificationsList.js","names":["Text"],"sources":["../../../../src/components/overlays/Notifications/PersistentNotificationsList.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { Fragment, Key, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\nimport { Divider } from '../../content/Divider';\nimport { Text } from '../../content/Text';\n\nimport { formatRelativeTime } from './format-relative-time';\nimport { NotificationActionInterceptorContext } from './NotificationAction';\nimport { NotificationCard } from './NotificationCard';\nimport { usePersistentNotifications } from './use-persistent-notifications';\n\nimport type {\n DismissReason,\n PersistentNotificationItem,\n PersistentNotificationsListProps,\n} from './types';\n\n// ─── Constants ───────────────────────────────────────────────────────\n\nconst MARK_READ_DELAY = 2000;\n/** Interval (ms) at which relative timestamps refresh while the list is mounted. */\nconst TIMESTAMP_REFRESH_INTERVAL = 10_000;\n\n// ─── Styled Components ──────────────────────────────────────────────\n\nconst ListContainer = tasty({\n qa: 'PersistentNotificationsList',\n role: 'log',\n 'aria-label': 'Notifications',\n styles: {\n display: 'flex',\n flow: 'column',\n },\n});\n\nconst EmptyStateContainer = tasty({\n styles: {\n display: 'flex',\n placeItems: 'center',\n placeContent: 'center',\n padding: '4x',\n color: '#dark.5',\n preset: 't3',\n },\n});\n\n// ─── PersistentNotificationsList Component ───────────────────────────\n\n/**\n * Standardized rendering for archived/persistent notifications.\n * Always reads items from the notification context.\n * Composable with app-specific shells (popover, dialog, page section).\n *\n * Marks all items as read after being visible for 2 seconds.\n * Relative timestamps refresh every 10 seconds while the list is mounted.\n *\n * Items are always dismissible. Dismissing an item removes it from the\n * persistent list and marks its ID as \"fully dismissed\" — subsequent triggers\n * with the same ID will be completely ignored (no overlay, no re-archival).\n *\n * @example\n * ```tsx\n * <PersistentNotificationsList emptyState=\"No notifications\" />\n * ```\n */\nexport function PersistentNotificationsList({\n onDismissItem,\n onAction,\n emptyState,\n}: PersistentNotificationsListProps) {\n const { items, remove, markAllAsRead } = usePersistentNotifications();\n\n // Default dismiss handler removes the item from the persistent list (which\n // also marks the id as \"fully dismissed\" so it won't reappear).\n // If a consumer provides `onDismissItem`, it is called *after* the built-in removal.\n const handleDismiss = useEvent((item: PersistentNotificationItem) => {\n remove(item.id);\n onDismissItem?.(item);\n });\n const markReadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Tick counter that increments every TIMESTAMP_REFRESH_INTERVAL to force\n // re-render so relative timestamps (e.g. \"5 min ago\") stay up to date.\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (items.length === 0) return;\n\n const interval = setInterval(() => {\n setTick((t) => t + 1);\n }, TIMESTAMP_REFRESH_INTERVAL);\n\n return () => clearInterval(interval);\n }, [items.length]);\n\n // Mark all persistent notifications as read after a 2s delay.\n // Re-starts the timer whenever items change (e.g. new unread items arrive\n // while the list is already visible).\n useEffect(() => {\n const hasUnread = items.some((i) => !i.isRead);\n\n if (!hasUnread) return;\n\n markReadTimerRef.current = setTimeout(() => {\n markAllAsRead();\n }, MARK_READ_DELAY);\n\n return () => {\n if (markReadTimerRef.current) {\n clearTimeout(markReadTimerRef.current);\n markReadTimerRef.current = null;\n }\n };\n }, [markAllAsRead, items]);\n\n if (items.length === 0) {\n return (\n <ListContainer>\n <EmptyStateContainer>\n {emptyState ?? 'No notifications'}\n </EmptyStateContainer>\n </ListContainer>\n );\n }\n\n return (\n <NotificationActionInterceptorContext.Provider value={onAction ?? null}>\n <ListContainer>\n {items.map((item, index) => (\n <Fragment key={String(item.id)}>\n {index > 0 && <Divider />}\n <PersistentNotificationListItem\n item={item}\n onDismiss={handleDismiss}\n />\n </Fragment>\n ))}\n </ListContainer>\n </NotificationActionInterceptorContext.Provider>\n );\n}\n\n// ─── List Item ───────────────────────────────────────────────────────\n\ninterface PersistentNotificationListItemProps {\n item: PersistentNotificationItem;\n onDismiss?: (item: PersistentNotificationItem) => void;\n}\n\nfunction PersistentNotificationListItem({\n item,\n onDismiss,\n}: PersistentNotificationListItemProps) {\n const suffix = (\n <Text opacity={0.5} preset=\"c2\">\n {formatRelativeTime(item.createdAt)}\n </Text>\n );\n\n // useEvent keeps the callback stable across re-renders regardless of\n // item reference changes (avoids unnecessary NotificationCard re-renders).\n const handleDismiss = useEvent((_id: Key, _reason: DismissReason) => {\n onDismiss?.(item);\n });\n\n const parentInterceptor = useContext(NotificationActionInterceptorContext);\n\n // Chains with the list-level interceptor (e.g. closing the parent popover).\n // Dismissal itself is handled by NotificationAction via the dismiss context\n // to avoid double-firing onDismiss.\n const handleItemAction = useEvent(() => {\n parentInterceptor?.();\n });\n\n return (\n <NotificationActionInterceptorContext.Provider value={handleItemAction}>\n <NotificationCard\n qa=\"PersistentNotificationItem\"\n theme={item.theme}\n title={item.title}\n description={item.description}\n icon={item.icon}\n actions={item.actions}\n isDismissable={!!onDismiss}\n elevated={false}\n notificationId={item.id}\n suffix={suffix}\n onDismiss={onDismiss ? handleDismiss : undefined}\n />\n </NotificationActionInterceptorContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAM,kBAAkB;;AAExB,MAAM,6BAA6B;AAInC,MAAM,gBAAgB,MAAM;CAC1B,IAAI;CACJ,MAAM;CACN,cAAc;CACd,QAAQ;EACN,SAAS;EACT,MAAM;EACP;CACF,CAAC;AAEF,MAAM,sBAAsB,MAAM,EAChC,QAAQ;CACN,SAAS;CACT,YAAY;CACZ,cAAc;CACd,SAAS;CACT,OAAO;CACP,QAAQ;CACT,EACF,CAAC;;;;;;;;;;;;;;;;;;AAqBF,SAAgB,4BAA4B,EAC1C,eACA,UACA,cACmC;CACnC,MAAM,EAAE,OAAO,QAAQ,kBAAkB,4BAA4B;CAKrE,MAAM,gBAAgB,UAAU,SAAqC;AACnE,SAAO,KAAK,GAAG;AACf,kBAAgB,KAAK;GACrB;CACF,MAAM,mBAAmB,OAA6C,KAAK;CAI3E,MAAM,GAAG,WAAW,SAAS,EAAE;AAE/B,iBAAgB;AACd,MAAI,MAAM,WAAW,EAAG;EAExB,MAAM,WAAW,kBAAkB;AACjC,YAAS,MAAM,IAAI,EAAE;KACpB,2BAA2B;AAE9B,eAAa,cAAc,SAAS;IACnC,CAAC,MAAM,OAAO,CAAC;AAKlB,iBAAgB;AAGd,MAAI,CAFc,MAAM,MAAM,MAAM,CAAC,EAAE,OAAO,CAE9B;AAEhB,mBAAiB,UAAU,iBAAiB;AAC1C,kBAAe;KACd,gBAAgB;AAEnB,eAAa;AACX,OAAI,iBAAiB,SAAS;AAC5B,iBAAa,iBAAiB,QAAQ;AACtC,qBAAiB,UAAU;;;IAG9B,CAAC,eAAe,MAAM,CAAC;AAE1B,KAAI,MAAM,WAAW,EACnB,QACE,oBAAC,2BACC,oBAAC,iCACE,cAAc,qBACK,GACR;AAIpB,QACE,oBAAC,qCAAqC;EAAS,OAAO,YAAY;YAChE,oBAAC,2BACE,MAAM,KAAK,MAAM,UAChB,qBAAC,uBACE,QAAQ,KAAK,oBAAC,YAAU,EACzB,oBAAC;GACO;GACN,WAAW;IACX,KALW,OAAO,KAAK,GAAG,CAMnB,CACX,GACY;GAC8B;;AAWpD,SAAS,+BAA+B,EACtC,MACA,aACsC;CACtC,MAAM,SACJ,oBAACA;EAAK,SAAS;EAAK,QAAO;YACxB,mBAAmB,KAAK,UAAU;GAC9B;CAKT,MAAM,gBAAgB,UAAU,KAAU,YAA2B;AACnE,cAAY,KAAK;GACjB;CAEF,MAAM,oBAAoB,WAAW,qCAAqC;CAK1E,MAAM,mBAAmB,eAAe;AACtC,uBAAqB;GACrB;AAEF,QACE,oBAAC,qCAAqC;EAAS,OAAO;YACpD,oBAAC;GACC,IAAG;GACH,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,MAAM,KAAK;GACX,SAAS,KAAK;GACd,eAAe,CAAC,CAAC;GACjB,UAAU;GACV,gBAAgB,KAAK;GACb;GACR,WAAW,YAAY,gBAAgB;IACvC;GAC4C"}
1
+ {"version":3,"file":"PersistentNotificationsList.js","names":["Text"],"sources":["../../../../src/components/overlays/Notifications/PersistentNotificationsList.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { Fragment, Key, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal';\nimport { useI18n } from '../../../i18n';\nimport { Divider } from '../../content/Divider';\nimport { Text } from '../../content/Text';\n\nimport { formatRelativeTime } from './format-relative-time';\nimport { NotificationActionInterceptorContext } from './NotificationAction';\nimport { NotificationCard } from './NotificationCard';\nimport { usePersistentNotifications } from './use-persistent-notifications';\n\nimport type {\n DismissReason,\n PersistentNotificationItem,\n PersistentNotificationsListProps,\n} from './types';\n\n// ─── Constants ───────────────────────────────────────────────────────\n\nconst MARK_READ_DELAY = 2000;\n/** Interval (ms) at which relative timestamps refresh while the list is mounted. */\nconst TIMESTAMP_REFRESH_INTERVAL = 10_000;\n\n// ─── Styled Components ──────────────────────────────────────────────\n\nconst ListContainer = tasty({\n qa: 'PersistentNotificationsList',\n role: 'log',\n styles: {\n display: 'flex',\n flow: 'column',\n },\n});\n\nconst EmptyStateContainer = tasty({\n styles: {\n display: 'flex',\n placeItems: 'center',\n placeContent: 'center',\n padding: '4x',\n color: '#dark.5',\n preset: 't3',\n },\n});\n\n// ─── PersistentNotificationsList Component ───────────────────────────\n\n/**\n * Standardized rendering for archived/persistent notifications.\n * Always reads items from the notification context.\n * Composable with app-specific shells (popover, dialog, page section).\n *\n * Marks all items as read after being visible for 2 seconds.\n * Relative timestamps refresh every 10 seconds while the list is mounted.\n *\n * Items are always dismissible. Dismissing an item removes it from the\n * persistent list and marks its ID as \"fully dismissed\" — subsequent triggers\n * with the same ID will be completely ignored (no overlay, no re-archival).\n *\n * @example\n * ```tsx\n * <PersistentNotificationsList emptyState=\"No notifications\" />\n * ```\n */\nexport function PersistentNotificationsList({\n onDismissItem,\n onAction,\n emptyState,\n}: PersistentNotificationsListProps) {\n const { t } = useI18n();\n const { items, remove, markAllAsRead } = usePersistentNotifications();\n const listAriaLabel = t('notifications.ariaLabel', 'Notifications');\n\n // Default dismiss handler removes the item from the persistent list (which\n // also marks the id as \"fully dismissed\" so it won't reappear).\n // If a consumer provides `onDismissItem`, it is called *after* the built-in removal.\n const handleDismiss = useEvent((item: PersistentNotificationItem) => {\n remove(item.id);\n onDismissItem?.(item);\n });\n const markReadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Tick counter that increments every TIMESTAMP_REFRESH_INTERVAL to force\n // re-render so relative timestamps (e.g. \"5 min ago\") stay up to date.\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (items.length === 0) return;\n\n const interval = setInterval(() => {\n setTick((t) => t + 1);\n }, TIMESTAMP_REFRESH_INTERVAL);\n\n return () => clearInterval(interval);\n }, [items.length]);\n\n // Mark all persistent notifications as read after a 2s delay.\n // Re-starts the timer whenever items change (e.g. new unread items arrive\n // while the list is already visible).\n useEffect(() => {\n const hasUnread = items.some((i) => !i.isRead);\n\n if (!hasUnread) return;\n\n markReadTimerRef.current = setTimeout(() => {\n markAllAsRead();\n }, MARK_READ_DELAY);\n\n return () => {\n if (markReadTimerRef.current) {\n clearTimeout(markReadTimerRef.current);\n markReadTimerRef.current = null;\n }\n };\n }, [markAllAsRead, items]);\n\n if (items.length === 0) {\n return (\n <ListContainer aria-label={listAriaLabel}>\n <EmptyStateContainer>\n {emptyState ?? t('notifications.empty', 'No notifications')}\n </EmptyStateContainer>\n </ListContainer>\n );\n }\n\n return (\n <NotificationActionInterceptorContext.Provider value={onAction ?? null}>\n <ListContainer aria-label={listAriaLabel}>\n {items.map((item, index) => (\n <Fragment key={String(item.id)}>\n {index > 0 && <Divider />}\n <PersistentNotificationListItem\n item={item}\n onDismiss={handleDismiss}\n />\n </Fragment>\n ))}\n </ListContainer>\n </NotificationActionInterceptorContext.Provider>\n );\n}\n\n// ─── List Item ───────────────────────────────────────────────────────\n\ninterface PersistentNotificationListItemProps {\n item: PersistentNotificationItem;\n onDismiss?: (item: PersistentNotificationItem) => void;\n}\n\nfunction PersistentNotificationListItem({\n item,\n onDismiss,\n}: PersistentNotificationListItemProps) {\n const { t } = useI18n();\n const suffix = (\n <Text opacity={0.5} preset=\"c2\">\n {formatRelativeTime(item.createdAt, t)}\n </Text>\n );\n\n // useEvent keeps the callback stable across re-renders regardless of\n // item reference changes (avoids unnecessary NotificationCard re-renders).\n const handleDismiss = useEvent((_id: Key, _reason: DismissReason) => {\n onDismiss?.(item);\n });\n\n const parentInterceptor = useContext(NotificationActionInterceptorContext);\n\n // Chains with the list-level interceptor (e.g. closing the parent popover).\n // Dismissal itself is handled by NotificationAction via the dismiss context\n // to avoid double-firing onDismiss.\n const handleItemAction = useEvent(() => {\n parentInterceptor?.();\n });\n\n return (\n <NotificationActionInterceptorContext.Provider value={handleItemAction}>\n <NotificationCard\n qa=\"PersistentNotificationItem\"\n theme={item.theme}\n title={item.title}\n description={item.description}\n icon={item.icon}\n actions={item.actions}\n isDismissable={!!onDismiss}\n elevated={false}\n notificationId={item.id}\n suffix={suffix}\n onDismiss={onDismiss ? handleDismiss : undefined}\n />\n </NotificationActionInterceptorContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,MAAM,kBAAkB;;AAExB,MAAM,6BAA6B;AAInC,MAAM,gBAAgB,MAAM;CAC1B,IAAI;CACJ,MAAM;CACN,QAAQ;EACN,SAAS;EACT,MAAM;EACP;CACF,CAAC;AAEF,MAAM,sBAAsB,MAAM,EAChC,QAAQ;CACN,SAAS;CACT,YAAY;CACZ,cAAc;CACd,SAAS;CACT,OAAO;CACP,QAAQ;CACT,EACF,CAAC;;;;;;;;;;;;;;;;;;AAqBF,SAAgB,4BAA4B,EAC1C,eACA,UACA,cACmC;CACnC,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,EAAE,OAAO,QAAQ,kBAAkB,4BAA4B;CACrE,MAAM,gBAAgB,EAAE,2BAA2B,gBAAgB;CAKnE,MAAM,gBAAgB,UAAU,SAAqC;AACnE,SAAO,KAAK,GAAG;AACf,kBAAgB,KAAK;GACrB;CACF,MAAM,mBAAmB,OAA6C,KAAK;CAI3E,MAAM,GAAG,WAAW,SAAS,EAAE;AAE/B,iBAAgB;AACd,MAAI,MAAM,WAAW,EAAG;EAExB,MAAM,WAAW,kBAAkB;AACjC,YAAS,MAAM,IAAI,EAAE;KACpB,2BAA2B;AAE9B,eAAa,cAAc,SAAS;IACnC,CAAC,MAAM,OAAO,CAAC;AAKlB,iBAAgB;AAGd,MAAI,CAFc,MAAM,MAAM,MAAM,CAAC,EAAE,OAAO,CAE9B;AAEhB,mBAAiB,UAAU,iBAAiB;AAC1C,kBAAe;KACd,gBAAgB;AAEnB,eAAa;AACX,OAAI,iBAAiB,SAAS;AAC5B,iBAAa,iBAAiB,QAAQ;AACtC,qBAAiB,UAAU;;;IAG9B,CAAC,eAAe,MAAM,CAAC;AAE1B,KAAI,MAAM,WAAW,EACnB,QACE,oBAAC;EAAc,cAAY;YACzB,oBAAC,iCACE,cAAc,EAAE,uBAAuB,mBAAmB,GACvC;GACR;AAIpB,QACE,oBAAC,qCAAqC;EAAS,OAAO,YAAY;YAChE,oBAAC;GAAc,cAAY;aACxB,MAAM,KAAK,MAAM,UAChB,qBAAC,uBACE,QAAQ,KAAK,oBAAC,YAAU,EACzB,oBAAC;IACO;IACN,WAAW;KACX,KALW,OAAO,KAAK,GAAG,CAMnB,CACX;IACY;GAC8B;;AAWpD,SAAS,+BAA+B,EACtC,MACA,aACsC;CACtC,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SACJ,oBAACA;EAAK,SAAS;EAAK,QAAO;YACxB,mBAAmB,KAAK,WAAW,EAAE;GACjC;CAKT,MAAM,gBAAgB,UAAU,KAAU,YAA2B;AACnE,cAAY,KAAK;GACjB;CAEF,MAAM,oBAAoB,WAAW,qCAAqC;CAK1E,MAAM,mBAAmB,eAAe;AACtC,uBAAqB;GACrB;AAEF,QACE,oBAAC,qCAAqC;EAAS,OAAO;YACpD,oBAAC;GACC,IAAG;GACH,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,MAAM,KAAK;GACX,SAAS,KAAK;GACd,eAAe,CAAC,CAAC;GACjB,UAAU;GACV,gBAAgB,KAAK;GACb;GACR,WAAW,YAAY,gBAAgB;IACvC;GAC4C"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  //#region src/components/overlays/Notifications/dismissed-storage.ts
3
3
  const STORAGE_KEY = "cube-ui-dismissed-notifications";
4
4
  const TTL_MS = 864e5;
@@ -1,10 +1,12 @@
1
1
 
2
+ import { TFunction } from "i18next";
3
+
2
4
  //#region src/components/overlays/Notifications/format-relative-time.d.ts
3
5
  /**
4
6
  * Lightweight relative time formatter.
5
- * No external dependencies.
6
7
  *
7
- * Output format:
8
+ * Output format (English source; localized via the `uikit` bundle's
9
+ * `relativeTime.*` keys):
8
10
  * - `just now` (< 1 minute)
9
11
  * - `N min ago` (1–59 minutes)
10
12
  * - `N h ago` (1–23 hours)
@@ -12,8 +14,12 @@
12
14
  * - `N w ago` (1–4 weeks)
13
15
  * - `N mo ago` (1–11 months)
14
16
  * - `N y ago` (1+ years)
17
+ *
18
+ * `t` is the UI Kit translation function (from `useI18n`), passed
19
+ * in so the string reacts to the active language. When omitted (non-component
20
+ * callers), English defaults are used.
15
21
  */
16
- declare function formatRelativeTime(timestamp: number): string;
22
+ declare function formatRelativeTime(timestamp: number, t?: TFunction): string;
17
23
  //#endregion
18
24
  export { formatRelativeTime };
19
25
  //# sourceMappingURL=format-relative-time.d.ts.map
@@ -1,10 +1,10 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  //#region src/components/overlays/Notifications/format-relative-time.ts
3
3
  /**
4
4
  * Lightweight relative time formatter.
5
- * No external dependencies.
6
5
  *
7
- * Output format:
6
+ * Output format (English source; localized via the `uikit` bundle's
7
+ * `relativeTime.*` keys):
8
8
  * - `just now` (< 1 minute)
9
9
  * - `N min ago` (1–59 minutes)
10
10
  * - `N h ago` (1–23 hours)
@@ -12,23 +12,31 @@
12
12
  * - `N w ago` (1–4 weeks)
13
13
  * - `N mo ago` (1–11 months)
14
14
  * - `N y ago` (1+ years)
15
+ *
16
+ * `t` is the UI Kit translation function (from `useI18n`), passed
17
+ * in so the string reacts to the active language. When omitted (non-component
18
+ * callers), English defaults are used.
15
19
  */
16
- function formatRelativeTime(timestamp) {
20
+ function formatRelativeTime(timestamp, t) {
21
+ const translate = (key, defaultValue, count) => {
22
+ if (t) return t(key, defaultValue, count != null ? { count } : void 0);
23
+ return count != null ? defaultValue.replace("{{count}}", String(count)) : defaultValue;
24
+ };
17
25
  const diffMs = Date.now() - timestamp;
18
- if (diffMs < 0) return "just now";
26
+ if (diffMs < 0) return translate("relativeTime.justNow", "just now");
19
27
  const diffSeconds = Math.floor(diffMs / 1e3);
20
28
  const diffMinutes = Math.floor(diffSeconds / 60);
21
29
  const diffHours = Math.floor(diffMinutes / 60);
22
30
  const diffDays = Math.floor(diffHours / 24);
23
- if (diffMinutes < 1) return "just now";
24
- if (diffHours < 1) return `${diffMinutes} min ago`;
25
- if (diffDays < 1) return `${diffHours} h ago`;
26
- if (diffDays < 7) return `${diffDays} d ago`;
31
+ if (diffMinutes < 1) return translate("relativeTime.justNow", "just now");
32
+ if (diffHours < 1) return translate("relativeTime.minAgo", "{{count}} min ago", diffMinutes);
33
+ if (diffDays < 1) return translate("relativeTime.hoursAgo", "{{count}} h ago", diffHours);
34
+ if (diffDays < 7) return translate("relativeTime.daysAgo", "{{count}} d ago", diffDays);
27
35
  const diffWeeks = Math.floor(diffDays / 7);
28
- if (diffDays < 30) return `${diffWeeks} w ago`;
36
+ if (diffDays < 30) return translate("relativeTime.weeksAgo", "{{count}} w ago", diffWeeks);
29
37
  const diffMonths = Math.floor(diffDays / 30);
30
- if (diffDays < 365) return `${diffMonths} mo ago`;
31
- return `${Math.floor(diffDays / 365)} y ago`;
38
+ if (diffDays < 365) return translate("relativeTime.monthsAgo", "{{count}} mo ago", diffMonths);
39
+ return translate("relativeTime.yearsAgo", "{{count}} y ago", Math.floor(diffDays / 365));
32
40
  }
33
41
 
34
42
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"format-relative-time.js","names":[],"sources":["../../../../src/components/overlays/Notifications/format-relative-time.ts"],"sourcesContent":["/**\n * Lightweight relative time formatter.\n * No external dependencies.\n *\n * Output format:\n * - `just now` (< 1 minute)\n * - `N min ago` (1–59 minutes)\n * - `N h ago` (1–23 hours)\n * - `N d ago` (1–6 days)\n * - `N w ago` (1–4 weeks)\n * - `N mo ago` (1–11 months)\n * - `N y ago` (1+ years)\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diffMs = now - timestamp;\n\n if (diffMs < 0) {\n return 'just now';\n }\n\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMinutes < 1) {\n return 'just now';\n }\n\n if (diffHours < 1) {\n return `${diffMinutes} min ago`;\n }\n\n if (diffDays < 1) {\n return `${diffHours} h ago`;\n }\n\n if (diffDays < 7) {\n return `${diffDays} d ago`;\n }\n\n const diffWeeks = Math.floor(diffDays / 7);\n\n if (diffDays < 30) {\n return `${diffWeeks} w ago`;\n }\n\n const diffMonths = Math.floor(diffDays / 30);\n\n if (diffDays < 365) {\n return `${diffMonths} mo ago`;\n }\n\n const diffYears = Math.floor(diffDays / 365);\n\n return `${diffYears} y ago`;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,SAAgB,mBAAmB,WAA2B;CAE5D,MAAM,SADM,KAAK,KAAK,GACD;AAErB,KAAI,SAAS,EACX,QAAO;CAGT,MAAM,cAAc,KAAK,MAAM,SAAS,IAAK;CAC7C,MAAM,cAAc,KAAK,MAAM,cAAc,GAAG;CAChD,MAAM,YAAY,KAAK,MAAM,cAAc,GAAG;CAC9C,MAAM,WAAW,KAAK,MAAM,YAAY,GAAG;AAE3C,KAAI,cAAc,EAChB,QAAO;AAGT,KAAI,YAAY,EACd,QAAO,GAAG,YAAY;AAGxB,KAAI,WAAW,EACb,QAAO,GAAG,UAAU;AAGtB,KAAI,WAAW,EACb,QAAO,GAAG,SAAS;CAGrB,MAAM,YAAY,KAAK,MAAM,WAAW,EAAE;AAE1C,KAAI,WAAW,GACb,QAAO,GAAG,UAAU;CAGtB,MAAM,aAAa,KAAK,MAAM,WAAW,GAAG;AAE5C,KAAI,WAAW,IACb,QAAO,GAAG,WAAW;AAKvB,QAAO,GAFW,KAAK,MAAM,WAAW,IAAI,CAExB"}
1
+ {"version":3,"file":"format-relative-time.js","names":[],"sources":["../../../../src/components/overlays/Notifications/format-relative-time.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\n/**\n * Lightweight relative time formatter.\n *\n * Output format (English source; localized via the `uikit` bundle's\n * `relativeTime.*` keys):\n * - `just now` (< 1 minute)\n * - `N min ago` (1–59 minutes)\n * - `N h ago` (1–23 hours)\n * - `N d ago` (1–6 days)\n * - `N w ago` (1–4 weeks)\n * - `N mo ago` (1–11 months)\n * - `N y ago` (1+ years)\n *\n * `t` is the UI Kit translation function (from `useI18n`), passed\n * in so the string reacts to the active language. When omitted (non-component\n * callers), English defaults are used.\n */\nexport function formatRelativeTime(timestamp: number, t?: TFunction): string {\n const translate = (\n key: string,\n defaultValue: string,\n count?: number,\n ): string => {\n if (t) {\n return t(key, defaultValue, count != null ? { count } : undefined);\n }\n\n return count != null\n ? defaultValue.replace('{{count}}', String(count))\n : defaultValue;\n };\n\n const now = Date.now();\n const diffMs = now - timestamp;\n\n if (diffMs < 0) {\n return translate('relativeTime.justNow', 'just now');\n }\n\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMinutes < 1) {\n return translate('relativeTime.justNow', 'just now');\n }\n\n if (diffHours < 1) {\n return translate('relativeTime.minAgo', '{{count}} min ago', diffMinutes);\n }\n\n if (diffDays < 1) {\n return translate('relativeTime.hoursAgo', '{{count}} h ago', diffHours);\n }\n\n if (diffDays < 7) {\n return translate('relativeTime.daysAgo', '{{count}} d ago', diffDays);\n }\n\n const diffWeeks = Math.floor(diffDays / 7);\n\n if (diffDays < 30) {\n return translate('relativeTime.weeksAgo', '{{count}} w ago', diffWeeks);\n }\n\n const diffMonths = Math.floor(diffDays / 30);\n\n if (diffDays < 365) {\n return translate('relativeTime.monthsAgo', '{{count}} mo ago', diffMonths);\n }\n\n const diffYears = Math.floor(diffDays / 365);\n\n return translate('relativeTime.yearsAgo', '{{count}} y ago', diffYears);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,mBAAmB,WAAmB,GAAuB;CAC3E,MAAM,aACJ,KACA,cACA,UACW;AACX,MAAI,EACF,QAAO,EAAE,KAAK,cAAc,SAAS,OAAO,EAAE,OAAO,GAAG,OAAU;AAGpE,SAAO,SAAS,OACZ,aAAa,QAAQ,aAAa,OAAO,MAAM,CAAC,GAChD;;CAIN,MAAM,SADM,KAAK,KAAK,GACD;AAErB,KAAI,SAAS,EACX,QAAO,UAAU,wBAAwB,WAAW;CAGtD,MAAM,cAAc,KAAK,MAAM,SAAS,IAAK;CAC7C,MAAM,cAAc,KAAK,MAAM,cAAc,GAAG;CAChD,MAAM,YAAY,KAAK,MAAM,cAAc,GAAG;CAC9C,MAAM,WAAW,KAAK,MAAM,YAAY,GAAG;AAE3C,KAAI,cAAc,EAChB,QAAO,UAAU,wBAAwB,WAAW;AAGtD,KAAI,YAAY,EACd,QAAO,UAAU,uBAAuB,qBAAqB,YAAY;AAG3E,KAAI,WAAW,EACb,QAAO,UAAU,yBAAyB,mBAAmB,UAAU;AAGzE,KAAI,WAAW,EACb,QAAO,UAAU,wBAAwB,mBAAmB,SAAS;CAGvE,MAAM,YAAY,KAAK,MAAM,WAAW,EAAE;AAE1C,KAAI,WAAW,GACb,QAAO,UAAU,yBAAyB,mBAAmB,UAAU;CAGzE,MAAM,aAAa,KAAK,MAAM,WAAW,GAAG;AAE5C,KAAI,WAAW,IACb,QAAO,UAAU,0BAA0B,oBAAoB,WAAW;AAK5E,QAAO,UAAU,yBAAyB,mBAFxB,KAAK,MAAM,WAAW,IAAI,CAE2B"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useToastContext } from "./NotificationContext.js";
3
3
  import { NotificationAction } from "./NotificationAction.js";
4
4
  import { NotificationCard } from "./NotificationCard.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.146.1 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { useRef, useState } from "react";
4
4