@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,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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
4
4
  import { _CollectionItem } from "../../CollectionItem.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 { filterCollectionItemProps } from "../../CollectionItem.js";
4
4
  import { _Item } from "../../content/Item/Item.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 { TooltipProvider } from "../../overlays/Tooltip/TooltipProvider.js";
3
3
  import { MenuItem } from "./MenuItem.js";
4
4
  import { StyledMenu, StyledSection, StyledSectionHeading } from "./styled.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 { SlotProvider } from "../../../utils/react/Slots.js";
3
3
  import { usePopoverSync } from "../../../utils/react/usePopoverSync.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.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 { usePopoverSync } from "../../../utils/react/usePopoverSync.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { MenuContext, useMenuContext } from "./context.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 React from "react";
3
3
 
4
4
  //#region src/components/actions/Menu/SubmenuTriggerContext.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 React, { useContext } from "react";
3
3
 
4
4
  //#region src/components/actions/Menu/context.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 { DEFAULT_CLEAR_STYLES } from "../../../data/item-themes.js";
3
3
  import { Space } from "../../layout/Space.js";
4
4
  import { DEFAULT_BUTTON_STYLES } from "../Button/Button.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 { ItemActionProvider, useItemActionContext } from "./ItemActionContext.js";
3
3
  import { openLink, parseTo, performClickHandler, useAction } from "./use-action.js";
4
4
  import { ItemAction } from "./ItemAction/ItemAction.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 { useEvent } from "../../_internal/hooks/use-event.js";
4
4
  import { useFocus as useFocus$1 } from "../../utils/react/interactions.js";
@@ -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 { mergeProps as mergeProps$1 } from "../../utils/react/mergeProps.js";
3
3
  import { usePopoverSync } from "../../utils/react/usePopoverSync.js";
4
4
  import { useEvent } from "../../_internal/hooks/use-event.js";
5
+ import { useI18n } from "../../i18n/useI18n.js";
5
6
  import { generateRandomId } from "../../utils/random.js";
6
7
  import { _MenuTrigger } from "./Menu/MenuTrigger.js";
7
8
  import { useEffect, useMemo, useRef, useState } from "react";
@@ -19,6 +20,7 @@ import { Pressable } from "@react-aria/interactions";
19
20
  * @returns An object with `anchorRef` to position the menu, `open` function to open the menu with provided props, `close` function to close the menu, and `rendered` JSX element to include in your component tree.
20
21
  */
21
22
  function useAnchoredMenu(Component, defaultTriggerProps, defaultMenuProps) {
23
+ const { t } = useI18n();
22
24
  const [isOpen, setIsOpen] = useState(false);
23
25
  const [componentProps, setComponentProps] = useState(null);
24
26
  const [triggerProps, setTriggerProps] = useState(null);
@@ -74,13 +76,14 @@ function useAnchoredMenu(Component, defaultTriggerProps, defaultMenuProps) {
74
76
  targetRef: anchorRef,
75
77
  popoverRef,
76
78
  onOpenChange: setIsOpen,
77
- children: [/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(Pressable, { children: /* @__PURE__ */ jsx("button", { "aria-label": "context-menu" }) }) }), /* @__PURE__ */ jsx(Component, { ...componentProps })]
79
+ children: [/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(Pressable, { children: /* @__PURE__ */ jsx("button", { "aria-label": t("contextMenu.contextMenu", "context-menu") }) }) }), /* @__PURE__ */ jsx(Component, { ...componentProps })]
78
80
  });
79
81
  }, [
80
82
  componentProps,
81
83
  triggerProps,
82
84
  isOpen,
83
- defaultTriggerProps
85
+ defaultTriggerProps,
86
+ t
84
87
  ]);
85
88
  return {
86
89
  anchorRef,
@@ -1 +1 @@
1
- {"version":3,"file":"use-anchored-menu.js","names":["MenuTrigger","mergeProps"],"sources":["../../../src/components/actions/use-anchored-menu.tsx"],"sourcesContent":["import { Pressable } from '@react-aria/interactions';\nimport {\n ComponentProps,\n ComponentType,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { VisuallyHidden } from 'react-aria';\n\nimport { useEvent } from '../../_internal';\nimport { generateRandomId } from '../../utils/random';\nimport { mergeProps } from '../../utils/react';\nimport { usePopoverSync } from '../../utils/react/usePopoverSync';\n\nimport { MenuTrigger } from './Menu';\n\nexport interface UseAnchoredMenuReturn<P, T> {\n /** Ref to attach to the anchor element for positioning the menu. */\n anchorRef: RefObject<HTMLElement | null>;\n\n /**\n * Programmatically opens the menu with the provided props.\n * @param props - Props to pass to the menu component\n * @param triggerProps - Additional props for MenuTrigger (merged with defaultTriggerProps)\n */\n open(props?: P, triggerProps?: T): void;\n\n /**\n * Updates the props of the currently open menu.\n * Props are merged if defaults are provided.\n */\n update(props: P, triggerProps?: T): void;\n\n /** Closes the menu programmatically. */\n close(): void;\n\n /** Current open/closed state of the menu. */\n isOpen: boolean;\n\n /**\n * JSX element that must be rendered in your component tree.\n * Contains the MenuTrigger and positioning logic.\n */\n get rendered(): ReactElement | null;\n}\n\n/**\n * Generic hook to manage an anchored menu component.\n *\n * @param Component - A React component that represents the menu content (Menu or CommandMenu).\n * @param defaultTriggerProps - Default props to pass to the MenuTrigger.\n * @param defaultMenuProps - Default props to pass to the Menu component.\n * @returns An object with `anchorRef` to position the menu, `open` function to open the menu with provided props, `close` function to close the menu, and `rendered` JSX element to include in your component tree.\n */\nexport function useAnchoredMenu<P, T = ComponentProps<typeof MenuTrigger>>(\n Component: ComponentType<P>,\n defaultTriggerProps?: Omit<\n ComponentProps<typeof MenuTrigger>,\n 'children' | 'isOpen' | 'onOpenChange' | 'targetRef'\n >,\n defaultMenuProps?: P,\n): UseAnchoredMenuReturn<P, T> {\n const [isOpen, setIsOpen] = useState(false);\n const [componentProps, setComponentProps] = useState<P | null>(null);\n const [triggerProps, setTriggerProps] = useState<T | null>(null);\n const anchorRef = useRef<HTMLElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const setupRef = useRef(false);\n\n useEffect(() => {\n const el = anchorRef.current;\n if (el) {\n el.dataset.popoverTrigger = '';\n return () => {\n delete el.dataset.popoverTrigger;\n };\n }\n }, []);\n\n // Generate a unique ID for this menu instance\n const menuId = useMemo(() => generateRandomId(), []);\n\n // Feed both the anchor (`triggerRef`) and the popover container\n // (`containerRef`) into the sync. The container ref is shared with the\n // rendered `MenuTrigger` via its `popoverRef` prop — the dummy `MenuTrigger`\n // opts out of `usePopoverSync` (`enabled: !isDummy`), so without this the\n // nested-popover guard would have no container to match against and a\n // `SubMenuTrigger` opened inside this menu would close the whole menu.\n usePopoverSync({\n menuId,\n isOpen,\n onClose: () => setIsOpen(false),\n triggerRef: anchorRef,\n containerRef: popoverRef,\n });\n\n function setupCheck() {\n if (!setupRef.current) {\n throw new Error(\n 'useAnchoredMenu: MenuTrigger must be rendered. Use `rendered` property to include it in your component tree.',\n );\n }\n }\n\n // 'open' accepts props required by the Component and opens the menu\n const open = useEvent((props: P = {} as P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n setIsOpen(true);\n });\n\n const update = useEvent((props: P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n });\n\n const close = useEvent(() => {\n setIsOpen(false);\n });\n\n // Render the menu only when componentProps is set\n const renderedMenu = useMemo(() => {\n if (!componentProps) return null;\n\n return (\n <MenuTrigger\n placement=\"bottom start\"\n {...mergeProps(defaultTriggerProps, triggerProps || undefined)}\n isDummy\n isOpen={isOpen}\n targetRef={anchorRef}\n popoverRef={popoverRef}\n onOpenChange={setIsOpen}\n >\n <VisuallyHidden>\n <Pressable>\n <button aria-label=\"context-menu\" />\n </Pressable>\n </VisuallyHidden>\n <Component {...componentProps} />\n </MenuTrigger>\n );\n }, [componentProps, triggerProps, isOpen, defaultTriggerProps]);\n\n return {\n anchorRef,\n open,\n update,\n close,\n isOpen,\n get rendered() {\n setupRef.current = true;\n\n return renderedMenu;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0DA,SAAgB,gBACd,WACA,qBAIA,kBAC6B;CAC7B,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,CAAC,gBAAgB,qBAAqB,SAAmB,KAAK;CACpE,MAAM,CAAC,cAAc,mBAAmB,SAAmB,KAAK;CAChE,MAAM,YAAY,OAAoB,KAAK;CAC3C,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,WAAW,OAAO,MAAM;AAE9B,iBAAgB;EACd,MAAM,KAAK,UAAU;AACrB,MAAI,IAAI;AACN,MAAG,QAAQ,iBAAiB;AAC5B,gBAAa;AACX,WAAO,GAAG,QAAQ;;;IAGrB,EAAE,CAAC;AAWN,gBAAe;EACb,QATa,cAAc,kBAAkB,EAAE,EAAE,CAAC;EAUlD;EACA,eAAe,UAAU,MAAM;EAC/B,YAAY;EACZ,cAAc;EACf,CAAC;CAEF,SAAS,aAAa;AACpB,MAAI,CAAC,SAAS,QACZ,OAAM,IAAI,MACR,+GACD;;CAKL,MAAM,OAAO,UAAU,QAAW,EAAE,EAAO,iBAAqB;AAC9D,cAAY;AAOZ,oBAJmB,mBACf;GAAE,GAAG;GAAkB,GAAG;GAAO,GACjC,MAEyB;AAC7B,kBAAgB,gBAAgB,KAAK;AACrC,YAAU,KAAK;GACf;CAEF,MAAM,SAAS,UAAU,OAAU,iBAAqB;AACtD,cAAY;AAOZ,oBAJmB,mBACf;GAAE,GAAG;GAAkB,GAAG;GAAO,GACjC,MAEyB;AAC7B,kBAAgB,gBAAgB,KAAK;GACrC;CAEF,MAAM,QAAQ,eAAe;AAC3B,YAAU,MAAM;GAChB;CAGF,MAAM,eAAe,cAAc;AACjC,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE,qBAACA;GACC,WAAU;GACV,GAAIC,aAAW,qBAAqB,gBAAgB,OAAU;GAC9D;GACQ;GACR,WAAW;GACC;GACZ,cAAc;cAEd,oBAAC,4BACC,oBAAC,uBACC,oBAAC,YAAO,cAAW,iBAAiB,GAC1B,GACG,EACjB,oBAAC,aAAU,GAAI,iBAAkB;IACrB;IAEf;EAAC;EAAgB;EAAc;EAAQ;EAAoB,CAAC;AAE/D,QAAO;EACL;EACA;EACA;EACA;EACA;EACA,IAAI,WAAW;AACb,YAAS,UAAU;AAEnB,UAAO;;EAEV"}
1
+ {"version":3,"file":"use-anchored-menu.js","names":["MenuTrigger","mergeProps"],"sources":["../../../src/components/actions/use-anchored-menu.tsx"],"sourcesContent":["import { Pressable } from '@react-aria/interactions';\nimport {\n ComponentProps,\n ComponentType,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { VisuallyHidden } from 'react-aria';\n\nimport { useEvent } from '../../_internal';\nimport { useI18n } from '../../i18n';\nimport { generateRandomId } from '../../utils/random';\nimport { mergeProps } from '../../utils/react';\nimport { usePopoverSync } from '../../utils/react/usePopoverSync';\n\nimport { MenuTrigger } from './Menu';\n\nexport interface UseAnchoredMenuReturn<P, T> {\n /** Ref to attach to the anchor element for positioning the menu. */\n anchorRef: RefObject<HTMLElement | null>;\n\n /**\n * Programmatically opens the menu with the provided props.\n * @param props - Props to pass to the menu component\n * @param triggerProps - Additional props for MenuTrigger (merged with defaultTriggerProps)\n */\n open(props?: P, triggerProps?: T): void;\n\n /**\n * Updates the props of the currently open menu.\n * Props are merged if defaults are provided.\n */\n update(props: P, triggerProps?: T): void;\n\n /** Closes the menu programmatically. */\n close(): void;\n\n /** Current open/closed state of the menu. */\n isOpen: boolean;\n\n /**\n * JSX element that must be rendered in your component tree.\n * Contains the MenuTrigger and positioning logic.\n */\n get rendered(): ReactElement | null;\n}\n\n/**\n * Generic hook to manage an anchored menu component.\n *\n * @param Component - A React component that represents the menu content (Menu or CommandMenu).\n * @param defaultTriggerProps - Default props to pass to the MenuTrigger.\n * @param defaultMenuProps - Default props to pass to the Menu component.\n * @returns An object with `anchorRef` to position the menu, `open` function to open the menu with provided props, `close` function to close the menu, and `rendered` JSX element to include in your component tree.\n */\nexport function useAnchoredMenu<P, T = ComponentProps<typeof MenuTrigger>>(\n Component: ComponentType<P>,\n defaultTriggerProps?: Omit<\n ComponentProps<typeof MenuTrigger>,\n 'children' | 'isOpen' | 'onOpenChange' | 'targetRef'\n >,\n defaultMenuProps?: P,\n): UseAnchoredMenuReturn<P, T> {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [componentProps, setComponentProps] = useState<P | null>(null);\n const [triggerProps, setTriggerProps] = useState<T | null>(null);\n const anchorRef = useRef<HTMLElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const setupRef = useRef(false);\n\n useEffect(() => {\n const el = anchorRef.current;\n if (el) {\n el.dataset.popoverTrigger = '';\n return () => {\n delete el.dataset.popoverTrigger;\n };\n }\n }, []);\n\n // Generate a unique ID for this menu instance\n const menuId = useMemo(() => generateRandomId(), []);\n\n // Feed both the anchor (`triggerRef`) and the popover container\n // (`containerRef`) into the sync. The container ref is shared with the\n // rendered `MenuTrigger` via its `popoverRef` prop — the dummy `MenuTrigger`\n // opts out of `usePopoverSync` (`enabled: !isDummy`), so without this the\n // nested-popover guard would have no container to match against and a\n // `SubMenuTrigger` opened inside this menu would close the whole menu.\n usePopoverSync({\n menuId,\n isOpen,\n onClose: () => setIsOpen(false),\n triggerRef: anchorRef,\n containerRef: popoverRef,\n });\n\n function setupCheck() {\n if (!setupRef.current) {\n throw new Error(\n 'useAnchoredMenu: MenuTrigger must be rendered. Use `rendered` property to include it in your component tree.',\n );\n }\n }\n\n // 'open' accepts props required by the Component and opens the menu\n const open = useEvent((props: P = {} as P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n setIsOpen(true);\n });\n\n const update = useEvent((props: P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n });\n\n const close = useEvent(() => {\n setIsOpen(false);\n });\n\n // Render the menu only when componentProps is set\n const renderedMenu = useMemo(() => {\n if (!componentProps) return null;\n\n return (\n <MenuTrigger\n placement=\"bottom start\"\n {...mergeProps(defaultTriggerProps, triggerProps || undefined)}\n isDummy\n isOpen={isOpen}\n targetRef={anchorRef}\n popoverRef={popoverRef}\n onOpenChange={setIsOpen}\n >\n <VisuallyHidden>\n <Pressable>\n <button aria-label={t('contextMenu.contextMenu', 'context-menu')} />\n </Pressable>\n </VisuallyHidden>\n <Component {...componentProps} />\n </MenuTrigger>\n );\n }, [componentProps, triggerProps, isOpen, defaultTriggerProps, t]);\n\n return {\n anchorRef,\n open,\n update,\n close,\n isOpen,\n get rendered() {\n setupRef.current = true;\n\n return renderedMenu;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2DA,SAAgB,gBACd,WACA,qBAIA,kBAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,CAAC,gBAAgB,qBAAqB,SAAmB,KAAK;CACpE,MAAM,CAAC,cAAc,mBAAmB,SAAmB,KAAK;CAChE,MAAM,YAAY,OAAoB,KAAK;CAC3C,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,WAAW,OAAO,MAAM;AAE9B,iBAAgB;EACd,MAAM,KAAK,UAAU;AACrB,MAAI,IAAI;AACN,MAAG,QAAQ,iBAAiB;AAC5B,gBAAa;AACX,WAAO,GAAG,QAAQ;;;IAGrB,EAAE,CAAC;AAWN,gBAAe;EACb,QATa,cAAc,kBAAkB,EAAE,EAAE,CAAC;EAUlD;EACA,eAAe,UAAU,MAAM;EAC/B,YAAY;EACZ,cAAc;EACf,CAAC;CAEF,SAAS,aAAa;AACpB,MAAI,CAAC,SAAS,QACZ,OAAM,IAAI,MACR,+GACD;;CAKL,MAAM,OAAO,UAAU,QAAW,EAAE,EAAO,iBAAqB;AAC9D,cAAY;AAOZ,oBAJmB,mBACf;GAAE,GAAG;GAAkB,GAAG;GAAO,GACjC,MAEyB;AAC7B,kBAAgB,gBAAgB,KAAK;AACrC,YAAU,KAAK;GACf;CAEF,MAAM,SAAS,UAAU,OAAU,iBAAqB;AACtD,cAAY;AAOZ,oBAJmB,mBACf;GAAE,GAAG;GAAkB,GAAG;GAAO,GACjC,MAEyB;AAC7B,kBAAgB,gBAAgB,KAAK;GACrC;CAEF,MAAM,QAAQ,eAAe;AAC3B,YAAU,MAAM;GAChB;CAGF,MAAM,eAAe,cAAc;AACjC,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE,qBAACA;GACC,WAAU;GACV,GAAIC,aAAW,qBAAqB,gBAAgB,OAAU;GAC9D;GACQ;GACR,WAAW;GACC;GACZ,cAAc;cAEd,oBAAC,4BACC,oBAAC,uBACC,oBAAC,YAAO,cAAY,EAAE,2BAA2B,eAAe,GAAI,GAC1D,GACG,EACjB,oBAAC,aAAU,GAAI,iBAAkB;IACrB;IAEf;EAAC;EAAgB;EAAc;EAAQ;EAAqB;EAAE,CAAC;AAElE,QAAO;EACL;EACA;EACA;EACA;EACA;EACA,IAAI,WAAW;AACb,YAAS,UAAU;AAEnB,UAAO;;EAEV"}
@@ -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 { mergeProps as mergeProps$1 } from "../../utils/react/mergeProps.js";
3
3
  import { usePopoverSync } from "../../utils/react/usePopoverSync.js";
4
4
  import { useEvent } from "../../_internal/hooks/use-event.js";
5
+ import { useI18n } from "../../i18n/useI18n.js";
5
6
  import { generateRandomId } from "../../utils/random.js";
6
7
  import { _MenuTrigger } from "./Menu/MenuTrigger.js";
7
8
  import { useEffect, useMemo, useRef, useState } from "react";
@@ -19,6 +20,7 @@ import { Pressable } from "@react-aria/interactions";
19
20
  * @returns An object with `targetRef` to attach to the container element, `open` function to open the menu at event coordinates, `close` function to close the menu, and `rendered` JSX element to include in your component tree.
20
21
  */
21
22
  function useContextMenu(Component, defaultTriggerProps, defaultMenuProps) {
23
+ const { t } = useI18n();
22
24
  const [isOpen, setIsOpen] = useState(false);
23
25
  const [componentProps, setComponentProps] = useState(null);
24
26
  const [triggerProps, setTriggerProps] = useState(null);
@@ -157,14 +159,15 @@ function useContextMenu(Component, defaultTriggerProps, defaultMenuProps) {
157
159
  targetRef: invisibleAnchorRef,
158
160
  popoverRef,
159
161
  onOpenChange: setIsOpen,
160
- children: [/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(Pressable, { children: /* @__PURE__ */ jsx("button", { "aria-label": "Open context menu" }) }) }), /* @__PURE__ */ jsx(Component, { ...componentProps })]
162
+ children: [/* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(Pressable, { children: /* @__PURE__ */ jsx("button", { "aria-label": t("contextMenu.openContextMenu", "Open context menu") }) }) }), /* @__PURE__ */ jsx(Component, { ...componentProps })]
161
163
  })] });
162
164
  }, [
163
165
  componentProps,
164
166
  triggerProps,
165
167
  isOpen,
166
168
  defaultTriggerProps,
167
- anchorPosition
169
+ anchorPosition,
170
+ t
168
171
  ]);
169
172
  return {
170
173
  targetRef,
@@ -1 +1 @@
1
- {"version":3,"file":"use-context-menu.js","names":["MenuTrigger","mergeProps"],"sources":["../../../src/components/actions/use-context-menu.tsx"],"sourcesContent":["import { Pressable } from '@react-aria/interactions';\nimport {\n ComponentProps,\n ComponentType,\n MouseEvent,\n PointerEvent,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { VisuallyHidden } from 'react-aria';\n\nimport { useEvent } from '../../_internal';\nimport { generateRandomId } from '../../utils/random';\nimport { mergeProps } from '../../utils/react';\nimport { usePopoverSync } from '../../utils/react/usePopoverSync';\n\nimport { MenuTrigger } from './Menu';\n\ntype NativeMouseEvent = globalThis.MouseEvent;\ntype NativePointerEvent = globalThis.PointerEvent;\n\nexport interface UseContextMenuReturn<\n E extends HTMLElement = HTMLElement,\n P extends object = {},\n T = ComponentProps<typeof MenuTrigger>,\n> {\n /** Container element that receives context menu events. Attach this ref to your target element. */\n targetRef: RefObject<E | null>;\n\n /**\n * Programmatically opens the menu at the specified coordinates or element center.\n * Runtime props are merged with defaultMenuProps (runtime props take precedence).\n *\n * @param props - Props to pass to the menu component (optional, defaults to defaultMenuProps)\n * @param triggerProps - Additional props for MenuTrigger (merged with defaultTriggerProps)\n * @param event - The pointer/mouse event containing coordinates for positioning (optional, centers on element if not provided)\n */\n open(\n props?: P,\n triggerProps?: T,\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ): void;\n\n /**\n * Updates the props of the currently open menu without repositioning.\n * Props are merged with defaultMenuProps.\n */\n update(props: P, triggerProps?: T): void;\n\n /** Closes the menu programmatically. */\n close(): void;\n\n /** Current open/closed state of the menu. */\n isOpen: boolean;\n\n /**\n * JSX element that must be rendered in your component tree.\n * Contains the MenuTrigger and positioning logic.\n * IMPORTANT: Must be placed directly inside the target container (the element with targetRef).\n */\n get rendered(): ReactElement | null;\n}\n\n/**\n * Generic hook to manage a context menu component that opens at pointer coordinates.\n *\n * @param Component - A React component that represents the menu content (Menu or CommandMenu).\n * @param defaultTriggerProps - Default props to pass to the MenuTrigger.\n * @param defaultMenuProps - Default props to pass to the Menu component.\n * @returns An object with `targetRef` to attach to the container element, `open` function to open the menu at event coordinates, `close` function to close the menu, and `rendered` JSX element to include in your component tree.\n */\nexport function useContextMenu<\n E extends HTMLElement = HTMLElement,\n P extends object = {},\n T = ComponentProps<typeof MenuTrigger>,\n>(\n Component: ComponentType<P>,\n defaultTriggerProps?: Omit<\n ComponentProps<typeof MenuTrigger>,\n 'children' | 'isOpen' | 'onOpenChange' | 'targetRef'\n >,\n defaultMenuProps?: P,\n): UseContextMenuReturn<E, P, T> {\n const [isOpen, setIsOpen] = useState(false);\n const [componentProps, setComponentProps] = useState<P | null>(null);\n const [triggerProps, setTriggerProps] = useState<T | null>(null);\n const [anchorPosition, setAnchorPosition] = useState<{\n x: number;\n y: number;\n } | null>(null);\n const targetRef = useRef<E>(null);\n const invisibleAnchorRef = useRef<HTMLSpanElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const setupRef = useRef(false);\n\n // Mark the container as a popover trigger so that other open menus' close-on-\n // outside predicates treat clicks inside it (including programmatic\n // open buttons rendered alongside a context-menu target) as a legitimate\n // trigger interaction instead of a generic outside click. This mirrors the\n // pattern in `useAnchoredMenu`.\n useEffect(() => {\n const el = targetRef.current;\n if (el) {\n el.dataset.popoverTrigger = '';\n return () => {\n delete el.dataset.popoverTrigger;\n };\n }\n }, []);\n\n // Generate a unique ID for this menu instance\n const menuId = useMemo(() => generateRandomId(), []);\n\n // Feed both the context-menu target (`triggerRef`) and the popover\n // container (`containerRef`) into the sync. The container ref is shared with\n // the rendered `MenuTrigger` via its `popoverRef` prop — the dummy\n // `MenuTrigger` opts out of `usePopoverSync` (`enabled: !isDummy`), so\n // without this the nested-popover guard would have no container to match\n // against and a `SubMenuTrigger` opened inside this menu would close the\n // whole menu.\n usePopoverSync({\n menuId,\n isOpen,\n onClose: () => {\n setIsOpen(false);\n setAnchorPosition(null);\n },\n triggerRef: targetRef as RefObject<HTMLElement | null>,\n containerRef: popoverRef,\n });\n\n function setupCheck() {\n if (!setupRef.current) {\n throw new Error(\n 'useContextMenu: MenuTrigger must be rendered. Use `rendered` property to include it in your component tree.',\n );\n }\n }\n\n // Helper function to calculate position relative to targetRef, taking the\n // element's scroll offset into account. Without the scroll offset the menu\n // would be rendered at the wrong place inside scrollable containers.\n const calculatePosition = (\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ) => {\n const container = targetRef.current;\n\n // If no event is provided, position at the center of the element\n if (!event) {\n if (!container) {\n return { x: 0, y: 0 };\n }\n\n const containerRect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const computed = window.getComputedStyle(container);\n const borderLeft = parseFloat(computed.borderLeftWidth) || 0;\n const borderTop = parseFloat(computed.borderTopWidth) || 0;\n\n // Position at the center of the element's content area\n const x = container.clientWidth / 2 + scrollLeft;\n const y = container.clientHeight / 2 + scrollTop;\n\n // Clamp to the full scroll size\n const clampedX = Math.max(0, Math.min(x, container.scrollWidth));\n const clampedY = Math.max(0, Math.min(y, container.scrollHeight));\n\n return { x: clampedX, y: clampedY };\n }\n\n // If the target reference is missing, fall back to viewport coordinates.\n if (!container) {\n const { clientX = 0, clientY = 0 } = event;\n\n return { x: clientX, y: clientY };\n }\n\n const containerRect = container.getBoundingClientRect();\n\n // Get coordinates from the event (viewport-relative)\n const { clientX, clientY } = event;\n\n // Take the element's scroll offset into account so that the coordinates are\n // relative to the **content** box, not the visible viewport of the\n // element.\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const computed = window.getComputedStyle(container);\n const borderLeft = parseFloat(computed.borderLeftWidth) || 0;\n const borderTop = parseFloat(computed.borderTopWidth) || 0;\n\n const x = clientX - containerRect.left - borderLeft + scrollLeft;\n const y = clientY - containerRect.top - borderTop + scrollTop;\n\n // Clamp to the full scroll size so that the invisible anchor always stays\n // inside the element regardless of the scroll position.\n const clampedX = Math.max(0, Math.min(x, container.scrollWidth));\n const clampedY = Math.max(0, Math.min(y, container.scrollHeight));\n\n return { x: clampedX, y: clampedY };\n };\n\n // 'open' accepts props, trigger props, and optional event for positioning, then opens the menu\n const open = useEvent(\n (\n props: P = {} as P,\n triggerProps?: T,\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ) => {\n setupCheck();\n\n // Ensure the target element can serve as a positioning context for the\n // invisible target element. If the consumer hasn't explicitly set\n // `position: relative | absolute | fixed | sticky` we switch it to\n // `relative` so that absolutely-positioned children are laid out correctly.\n if (targetRef.current) {\n const computedStyle = window.getComputedStyle(targetRef.current);\n\n if (computedStyle.position === 'static') {\n targetRef.current.style.position = 'relative';\n }\n }\n\n // Prevent default context menu if it's a context menu event\n if (\n event &&\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n\n const { x, y } = calculatePosition(event);\n setAnchorPosition({ x, y });\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n setIsOpen(true);\n },\n );\n\n const update = useEvent((props: P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps as P);\n setTriggerProps(triggerProps ?? null);\n });\n\n const close = useEvent(() => {\n setIsOpen(false);\n setAnchorPosition(null);\n });\n\n // Context menu event handler\n const onContextMenu = useEvent(\n (event: MouseEvent | PointerEvent | MouseEvent | PointerEvent) => {\n event.preventDefault();\n if (isOpen) {\n const pos = calculatePosition(event);\n setAnchorPosition(pos);\n } else {\n open(defaultMenuProps, undefined, event);\n }\n },\n );\n\n // Bind the onContextMenu event to targetRef\n useEffect(() => {\n const element = targetRef.current;\n if (!element) return;\n\n element.addEventListener('contextmenu', onContextMenu as any);\n\n return () => {\n element.removeEventListener('contextmenu', onContextMenu as any);\n };\n }, [onContextMenu]);\n\n // Render the menu only when componentProps is set\n const renderedMenu = useMemo(() => {\n if (!componentProps || !anchorPosition) return null;\n\n return (\n <>\n {/* Invisible anchor element positioned at click coordinates */}\n <span\n ref={invisibleAnchorRef}\n style={{\n position: 'absolute',\n left: `${anchorPosition.x}px`,\n top: `${anchorPosition.y}px`,\n width: '0px',\n height: '0px',\n lineHeight: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n }}\n />\n <MenuTrigger\n offset={0}\n crossOffset={0}\n placement={\n (triggerProps as ComponentProps<typeof MenuTrigger>)?.placement ||\n defaultTriggerProps?.placement ||\n 'bottom start'\n }\n {...mergeProps(defaultTriggerProps, triggerProps || undefined)}\n isDummy\n isOpen={isOpen}\n targetRef={invisibleAnchorRef}\n popoverRef={popoverRef}\n onOpenChange={setIsOpen}\n >\n <VisuallyHidden>\n <Pressable>\n <button aria-label=\"Open context menu\" />\n </Pressable>\n </VisuallyHidden>\n <Component {...componentProps} />\n </MenuTrigger>\n </>\n );\n }, [\n componentProps,\n triggerProps,\n isOpen,\n defaultTriggerProps,\n anchorPosition,\n ]);\n\n return {\n targetRef,\n open,\n update,\n close,\n isOpen,\n get rendered() {\n setupRef.current = true;\n\n return renderedMenu;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-context-menu.js","names":["MenuTrigger","mergeProps"],"sources":["../../../src/components/actions/use-context-menu.tsx"],"sourcesContent":["import { Pressable } from '@react-aria/interactions';\nimport {\n ComponentProps,\n ComponentType,\n MouseEvent,\n PointerEvent,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { VisuallyHidden } from 'react-aria';\n\nimport { useEvent } from '../../_internal';\nimport { useI18n } from '../../i18n';\nimport { generateRandomId } from '../../utils/random';\nimport { mergeProps } from '../../utils/react';\nimport { usePopoverSync } from '../../utils/react/usePopoverSync';\n\nimport { MenuTrigger } from './Menu';\n\ntype NativeMouseEvent = globalThis.MouseEvent;\ntype NativePointerEvent = globalThis.PointerEvent;\n\nexport interface UseContextMenuReturn<\n E extends HTMLElement = HTMLElement,\n P extends object = {},\n T = ComponentProps<typeof MenuTrigger>,\n> {\n /** Container element that receives context menu events. Attach this ref to your target element. */\n targetRef: RefObject<E | null>;\n\n /**\n * Programmatically opens the menu at the specified coordinates or element center.\n * Runtime props are merged with defaultMenuProps (runtime props take precedence).\n *\n * @param props - Props to pass to the menu component (optional, defaults to defaultMenuProps)\n * @param triggerProps - Additional props for MenuTrigger (merged with defaultTriggerProps)\n * @param event - The pointer/mouse event containing coordinates for positioning (optional, centers on element if not provided)\n */\n open(\n props?: P,\n triggerProps?: T,\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ): void;\n\n /**\n * Updates the props of the currently open menu without repositioning.\n * Props are merged with defaultMenuProps.\n */\n update(props: P, triggerProps?: T): void;\n\n /** Closes the menu programmatically. */\n close(): void;\n\n /** Current open/closed state of the menu. */\n isOpen: boolean;\n\n /**\n * JSX element that must be rendered in your component tree.\n * Contains the MenuTrigger and positioning logic.\n * IMPORTANT: Must be placed directly inside the target container (the element with targetRef).\n */\n get rendered(): ReactElement | null;\n}\n\n/**\n * Generic hook to manage a context menu component that opens at pointer coordinates.\n *\n * @param Component - A React component that represents the menu content (Menu or CommandMenu).\n * @param defaultTriggerProps - Default props to pass to the MenuTrigger.\n * @param defaultMenuProps - Default props to pass to the Menu component.\n * @returns An object with `targetRef` to attach to the container element, `open` function to open the menu at event coordinates, `close` function to close the menu, and `rendered` JSX element to include in your component tree.\n */\nexport function useContextMenu<\n E extends HTMLElement = HTMLElement,\n P extends object = {},\n T = ComponentProps<typeof MenuTrigger>,\n>(\n Component: ComponentType<P>,\n defaultTriggerProps?: Omit<\n ComponentProps<typeof MenuTrigger>,\n 'children' | 'isOpen' | 'onOpenChange' | 'targetRef'\n >,\n defaultMenuProps?: P,\n): UseContextMenuReturn<E, P, T> {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const [componentProps, setComponentProps] = useState<P | null>(null);\n const [triggerProps, setTriggerProps] = useState<T | null>(null);\n const [anchorPosition, setAnchorPosition] = useState<{\n x: number;\n y: number;\n } | null>(null);\n const targetRef = useRef<E>(null);\n const invisibleAnchorRef = useRef<HTMLSpanElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const setupRef = useRef(false);\n\n // Mark the container as a popover trigger so that other open menus' close-on-\n // outside predicates treat clicks inside it (including programmatic\n // open buttons rendered alongside a context-menu target) as a legitimate\n // trigger interaction instead of a generic outside click. This mirrors the\n // pattern in `useAnchoredMenu`.\n useEffect(() => {\n const el = targetRef.current;\n if (el) {\n el.dataset.popoverTrigger = '';\n return () => {\n delete el.dataset.popoverTrigger;\n };\n }\n }, []);\n\n // Generate a unique ID for this menu instance\n const menuId = useMemo(() => generateRandomId(), []);\n\n // Feed both the context-menu target (`triggerRef`) and the popover\n // container (`containerRef`) into the sync. The container ref is shared with\n // the rendered `MenuTrigger` via its `popoverRef` prop — the dummy\n // `MenuTrigger` opts out of `usePopoverSync` (`enabled: !isDummy`), so\n // without this the nested-popover guard would have no container to match\n // against and a `SubMenuTrigger` opened inside this menu would close the\n // whole menu.\n usePopoverSync({\n menuId,\n isOpen,\n onClose: () => {\n setIsOpen(false);\n setAnchorPosition(null);\n },\n triggerRef: targetRef as RefObject<HTMLElement | null>,\n containerRef: popoverRef,\n });\n\n function setupCheck() {\n if (!setupRef.current) {\n throw new Error(\n 'useContextMenu: MenuTrigger must be rendered. Use `rendered` property to include it in your component tree.',\n );\n }\n }\n\n // Helper function to calculate position relative to targetRef, taking the\n // element's scroll offset into account. Without the scroll offset the menu\n // would be rendered at the wrong place inside scrollable containers.\n const calculatePosition = (\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ) => {\n const container = targetRef.current;\n\n // If no event is provided, position at the center of the element\n if (!event) {\n if (!container) {\n return { x: 0, y: 0 };\n }\n\n const containerRect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const computed = window.getComputedStyle(container);\n const borderLeft = parseFloat(computed.borderLeftWidth) || 0;\n const borderTop = parseFloat(computed.borderTopWidth) || 0;\n\n // Position at the center of the element's content area\n const x = container.clientWidth / 2 + scrollLeft;\n const y = container.clientHeight / 2 + scrollTop;\n\n // Clamp to the full scroll size\n const clampedX = Math.max(0, Math.min(x, container.scrollWidth));\n const clampedY = Math.max(0, Math.min(y, container.scrollHeight));\n\n return { x: clampedX, y: clampedY };\n }\n\n // If the target reference is missing, fall back to viewport coordinates.\n if (!container) {\n const { clientX = 0, clientY = 0 } = event;\n\n return { x: clientX, y: clientY };\n }\n\n const containerRect = container.getBoundingClientRect();\n\n // Get coordinates from the event (viewport-relative)\n const { clientX, clientY } = event;\n\n // Take the element's scroll offset into account so that the coordinates are\n // relative to the **content** box, not the visible viewport of the\n // element.\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const computed = window.getComputedStyle(container);\n const borderLeft = parseFloat(computed.borderLeftWidth) || 0;\n const borderTop = parseFloat(computed.borderTopWidth) || 0;\n\n const x = clientX - containerRect.left - borderLeft + scrollLeft;\n const y = clientY - containerRect.top - borderTop + scrollTop;\n\n // Clamp to the full scroll size so that the invisible anchor always stays\n // inside the element regardless of the scroll position.\n const clampedX = Math.max(0, Math.min(x, container.scrollWidth));\n const clampedY = Math.max(0, Math.min(y, container.scrollHeight));\n\n return { x: clampedX, y: clampedY };\n };\n\n // 'open' accepts props, trigger props, and optional event for positioning, then opens the menu\n const open = useEvent(\n (\n props: P = {} as P,\n triggerProps?: T,\n event?: NativeMouseEvent | NativePointerEvent | MouseEvent | PointerEvent,\n ) => {\n setupCheck();\n\n // Ensure the target element can serve as a positioning context for the\n // invisible target element. If the consumer hasn't explicitly set\n // `position: relative | absolute | fixed | sticky` we switch it to\n // `relative` so that absolutely-positioned children are laid out correctly.\n if (targetRef.current) {\n const computedStyle = window.getComputedStyle(targetRef.current);\n\n if (computedStyle.position === 'static') {\n targetRef.current.style.position = 'relative';\n }\n }\n\n // Prevent default context menu if it's a context menu event\n if (\n event &&\n 'preventDefault' in event &&\n typeof event.preventDefault === 'function'\n ) {\n event.preventDefault();\n }\n\n const { x, y } = calculatePosition(event);\n setAnchorPosition({ x, y });\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps);\n setTriggerProps(triggerProps ?? null);\n setIsOpen(true);\n },\n );\n\n const update = useEvent((props: P, triggerProps?: T) => {\n setupCheck();\n\n // Merge defaultMenuProps with provided props\n const finalProps = defaultMenuProps\n ? { ...defaultMenuProps, ...props }\n : props;\n\n setComponentProps(finalProps as P);\n setTriggerProps(triggerProps ?? null);\n });\n\n const close = useEvent(() => {\n setIsOpen(false);\n setAnchorPosition(null);\n });\n\n // Context menu event handler\n const onContextMenu = useEvent(\n (event: MouseEvent | PointerEvent | MouseEvent | PointerEvent) => {\n event.preventDefault();\n if (isOpen) {\n const pos = calculatePosition(event);\n setAnchorPosition(pos);\n } else {\n open(defaultMenuProps, undefined, event);\n }\n },\n );\n\n // Bind the onContextMenu event to targetRef\n useEffect(() => {\n const element = targetRef.current;\n if (!element) return;\n\n element.addEventListener('contextmenu', onContextMenu as any);\n\n return () => {\n element.removeEventListener('contextmenu', onContextMenu as any);\n };\n }, [onContextMenu]);\n\n // Render the menu only when componentProps is set\n const renderedMenu = useMemo(() => {\n if (!componentProps || !anchorPosition) return null;\n\n return (\n <>\n {/* Invisible anchor element positioned at click coordinates */}\n <span\n ref={invisibleAnchorRef}\n style={{\n position: 'absolute',\n left: `${anchorPosition.x}px`,\n top: `${anchorPosition.y}px`,\n width: '0px',\n height: '0px',\n lineHeight: '0',\n pointerEvents: 'none',\n visibility: 'hidden',\n }}\n />\n <MenuTrigger\n offset={0}\n crossOffset={0}\n placement={\n (triggerProps as ComponentProps<typeof MenuTrigger>)?.placement ||\n defaultTriggerProps?.placement ||\n 'bottom start'\n }\n {...mergeProps(defaultTriggerProps, triggerProps || undefined)}\n isDummy\n isOpen={isOpen}\n targetRef={invisibleAnchorRef}\n popoverRef={popoverRef}\n onOpenChange={setIsOpen}\n >\n <VisuallyHidden>\n <Pressable>\n <button\n aria-label={t(\n 'contextMenu.openContextMenu',\n 'Open context menu',\n )}\n />\n </Pressable>\n </VisuallyHidden>\n <Component {...componentProps} />\n </MenuTrigger>\n </>\n );\n }, [\n componentProps,\n triggerProps,\n isOpen,\n defaultTriggerProps,\n anchorPosition,\n t,\n ]);\n\n return {\n targetRef,\n open,\n update,\n close,\n isOpen,\n get rendered() {\n setupRef.current = true;\n\n return renderedMenu;\n },\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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
4
4
  import { useFocus as useFocus$1 } from "../../../utils/react/interactions.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 themes_default from "../../../data/themes.js";
3
3
  import { useAlert } from "./use-alert.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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { useDeprecationWarning } from "../../../_internal/hooks/use-deprecation-warning.js";
4
4
  import { CONTAINER_STYLES, TEXT_STYLES, filterBaseProps } 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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, Element, filterBaseProps } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -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 { _Item } from "../Item/Item.js";
3
3
  import themes_default from "../../../data/themes.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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -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 { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { CONTAINER_STYLES, TEXT_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { useTimer } from "../../../_internal/hooks/use-timer/use-timer.js";
4
+ import { useI18n } from "../../../i18n/useI18n.js";
4
5
  import { CopyIcon } from "../../../icons/CopyIcon.js";
5
6
  import { Button } from "../../actions/index.js";
6
7
  import { useToast } from "../../overlays/Toast/useToast.js";
@@ -77,7 +78,6 @@ const CopyPasteBlockElement = tasty(Card, {
77
78
  const CopyButton = tasty(Button, {
78
79
  type: "clear",
79
80
  icon: /* @__PURE__ */ jsx(CopyIcon, {}),
80
- "aria-label": "Copy to clipboard",
81
81
  styles: {
82
82
  placeSelf: "stretch",
83
83
  border: "#clear",
@@ -96,6 +96,7 @@ const CopyButton = tasty(Button, {
96
96
  function CopyPasteBlock(allProps, ref) {
97
97
  const { value = "", onPaste, placeholder, title, size = "medium", ...props } = allProps;
98
98
  const styles = extractStyles(props, POSITION_STYLES);
99
+ const { t } = useI18n();
99
100
  const [error, setError] = useState(null);
100
101
  const toast = useToast();
101
102
  const { clipboardProps } = useClipboard({
@@ -111,7 +112,7 @@ function CopyPasteBlock(allProps, ref) {
111
112
  return value ? [{ "text/plain": value }] : [];
112
113
  },
113
114
  onCopy() {
114
- if (value) toast.success(`${title || "Text"} copied`);
115
+ if (value) toast.success(t("copyPasteBlock.copied", "{{title}} copied", { title: title || t("copyPasteBlock.defaultTitle", "Text") }));
115
116
  }
116
117
  });
117
118
  useTimer({
@@ -123,7 +124,7 @@ function CopyPasteBlock(allProps, ref) {
123
124
  });
124
125
  async function onCopy() {
125
126
  await copy(value);
126
- toast.success(`${title || "Text"} copied`);
127
+ toast.success(t("copyPasteBlock.copied", "{{title}} copied", { title: title || t("copyPasteBlock.defaultTitle", "Text") }));
127
128
  }
128
129
  const pristineValue = value.replace(/\n/, " ");
129
130
  return /* @__PURE__ */ jsx(CopyPasteBlockElement, {
@@ -141,7 +142,7 @@ function CopyPasteBlock(allProps, ref) {
141
142
  mods: { placeholder: !!placeholder || !value },
142
143
  children: [/* @__PURE__ */ jsx("div", {
143
144
  "data-element": "Label",
144
- children: error != null ? error || "Invalid data" : value ? pristineValue : /* @__PURE__ */ jsx(Fragment$1, { children: placeholder ? placeholder : "Select and paste" })
145
+ children: error != null ? error || t("copyPasteBlock.invalidData", "Invalid data") : value ? pristineValue : /* @__PURE__ */ jsx(Fragment$1, { children: placeholder ? placeholder : t("copyPasteBlock.selectAndPaste", "Select and paste") })
145
146
  }), /* @__PURE__ */ jsxs("span", {
146
147
  "data-element": "Shortcut",
147
148
  children: [
@@ -152,7 +153,7 @@ function CopyPasteBlock(allProps, ref) {
152
153
  })]
153
154
  }), value && !error && /* @__PURE__ */ jsx(CopyButton, {
154
155
  size,
155
- "aria-label": `Copy ${title}`,
156
+ "aria-label": t("copyPasteBlock.copyToClipboard", "Copy {{title}} to clipboard", { title: title || t("copyPasteBlock.defaultTitle", "Text") }),
156
157
  onPress: onCopy
157
158
  })]
158
159
  })
@@ -1 +1 @@
1
- {"version":3,"file":"CopyPasteBlock.js","names":[],"sources":["../../../../src/components/content/CopyPasteBlock/CopyPasteBlock.tsx"],"sourcesContent":["import {\n POSITION_STYLES,\n PositionStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport copy from 'clipboard-copy';\nimport { ForwardedRef, forwardRef, ReactNode, useState } from 'react';\nimport { TextDropItem, useClipboard } from 'react-aria';\n\nimport { useTimer } from '../../../_internal';\nimport { CopyIcon } from '../../../icons';\nimport { extractStyles } from '../../../utils/styles';\nimport { Button } from '../../actions';\nimport { useToast } from '../../overlays/Toast';\nimport { Card, CubeCardProps } from '../Card/Card';\n\nconst StyledBlock = tasty({\n styles: {\n display: 'grid',\n flow: 'column',\n placeContent: 'center space-between',\n placeItems: 'center stretch',\n gap: '1x',\n position: 'relative',\n width: 'max 100%',\n color: 'inherit',\n padding: '0 1.5x',\n // height: {\n // '': '4.5x',\n // '[data-size=\"small\"]': '3.5x',\n // '[data-size=\"large\"]': '5.5x',\n // },\n userSelect: 'none',\n\n Label: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n },\n});\n\nconst CopyPasteBlockElement = tasty(Card, {\n qa: 'CopyPasteBlock',\n styles: {\n display: 'grid',\n fill: '#surface-2',\n radius: '1r',\n padding: {\n '': '0 1px',\n ':focus': '0',\n },\n color: {\n '': '#dark',\n error: '#danger-text',\n },\n border: {\n '': 'dashed #dark-03',\n ':focus': '2px dashed #primary-text',\n error: 'dashed #danger',\n },\n cursor: '$pointer',\n preset: {\n '': 't3',\n 'size=large': 't2',\n },\n height: {\n '': '5x',\n 'size=small': '4x',\n 'size=large': '6x',\n },\n boxSizing: 'border-box',\n\n Grid: {\n display: 'grid',\n flow: 'row',\n gridColumns: 'minmax(0, 1fr) min-content',\n placeContent: 'stretch',\n width: 'min 20x',\n radius: '1r',\n position: 'relative',\n },\n\n Shortcut: {\n display: {\n '': 'none',\n ':focus & !error': 'inline',\n },\n },\n },\n});\n\nconst CopyButton = tasty(Button, {\n type: 'clear',\n icon: <CopyIcon />,\n 'aria-label': 'Copy to clipboard',\n styles: {\n placeSelf: 'stretch',\n border: '#clear',\n shadow: {\n '': '0 0 0 1ow #purple-03.0 inset',\n focused: '0 0 0 1ow #purple-03 inset',\n },\n radius: {\n '': '0 1r 1r 0',\n 'multiline | has-scroll': '0 1r 0 0',\n },\n height: 'auto',\n outline: false,\n },\n});\n\nexport interface CubeCopyPasteBlockProps\n extends Omit<CubeCardProps, 'onPaste' | 'onCopy'>,\n PositionStyleProps {\n padding?: Styles['padding'];\n /** The code snippet */\n value?: string;\n placeholder?: ReactNode;\n /** The title of the snippet */\n title?: string;\n onPaste?: (text: string) => void | Promise<void | string>;\n onCopy?: () => void;\n size?: 'small' | 'medium' | 'large';\n}\n\nfunction CopyPasteBlock(\n allProps: CubeCopyPasteBlockProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n value = '',\n onPaste,\n placeholder,\n title,\n size = 'medium',\n ...props\n } = allProps;\n const styles = extractStyles(props, POSITION_STYLES);\n\n const [error, setError] = useState<string | null>(null);\n const toast = useToast();\n\n const { clipboardProps } = useClipboard({\n async onPaste(items) {\n let pasted = await Promise.all(\n items\n .filter(\n (item) => item.kind === 'text' && item.types.has('text/plain'),\n )\n .map((item) => (item as TextDropItem).getText('text/plain')),\n );\n try {\n await onPaste?.(pasted.join('\\n'));\n } catch (e) {\n setError(String(e));\n }\n },\n getItems() {\n return value\n ? [\n {\n 'text/plain': value,\n },\n ]\n : [];\n },\n onCopy() {\n if (value) {\n toast.success(`${title || 'Text'} copied`);\n }\n },\n });\n\n useTimer({\n delay: 1000,\n callback() {\n setError(null);\n },\n isDisabled: !error,\n });\n\n async function onCopy() {\n await copy(value);\n\n toast.success(`${title || 'Text'} copied`);\n }\n\n const pristineValue = value.replace(/\\n/, ' ');\n\n return (\n <CopyPasteBlockElement\n ref={ref}\n mods={{ error: !!error }}\n data-size={size}\n styles={styles}\n tabIndex=\"0\"\n {...props}\n {...clipboardProps}\n >\n <div data-element=\"Grid\">\n <StyledBlock\n data-size={size}\n mods={{\n placeholder: !!placeholder || !value,\n }}\n >\n <div data-element=\"Label\">\n {error != null ? (\n error || 'Invalid data'\n ) : value ? (\n pristineValue\n ) : (\n <>{placeholder ? placeholder : 'Select and paste'}</>\n )}\n </div>\n <span data-element=\"Shortcut\">\n <kbd>Cmd</kbd> + <kbd>V</kbd>\n </span>\n </StyledBlock>\n {value && !error && (\n <CopyButton\n size={size}\n aria-label={`Copy ${title}`}\n onPress={onCopy}\n />\n )}\n </div>\n </CopyPasteBlockElement>\n );\n}\n\nconst _CopyPasteBlock = forwardRef(CopyPasteBlock);\n\n_CopyPasteBlock.displayName = 'CopyPasteBlock';\n\nexport { _CopyPasteBlock as CopyPasteBlock };\n"],"mappings":"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"}
1
+ {"version":3,"file":"CopyPasteBlock.js","names":[],"sources":["../../../../src/components/content/CopyPasteBlock/CopyPasteBlock.tsx"],"sourcesContent":["import {\n POSITION_STYLES,\n PositionStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport copy from 'clipboard-copy';\nimport { ForwardedRef, forwardRef, ReactNode, useState } from 'react';\nimport { TextDropItem, useClipboard } from 'react-aria';\n\nimport { useTimer } from '../../../_internal';\nimport { useI18n } from '../../../i18n';\nimport { CopyIcon } from '../../../icons';\nimport { extractStyles } from '../../../utils/styles';\nimport { Button } from '../../actions';\nimport { useToast } from '../../overlays/Toast';\nimport { Card, CubeCardProps } from '../Card/Card';\n\nconst StyledBlock = tasty({\n styles: {\n display: 'grid',\n flow: 'column',\n placeContent: 'center space-between',\n placeItems: 'center stretch',\n gap: '1x',\n position: 'relative',\n width: 'max 100%',\n color: 'inherit',\n padding: '0 1.5x',\n // height: {\n // '': '4.5x',\n // '[data-size=\"small\"]': '3.5x',\n // '[data-size=\"large\"]': '5.5x',\n // },\n userSelect: 'none',\n\n Label: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n },\n});\n\nconst CopyPasteBlockElement = tasty(Card, {\n qa: 'CopyPasteBlock',\n styles: {\n display: 'grid',\n fill: '#surface-2',\n radius: '1r',\n padding: {\n '': '0 1px',\n ':focus': '0',\n },\n color: {\n '': '#dark',\n error: '#danger-text',\n },\n border: {\n '': 'dashed #dark-03',\n ':focus': '2px dashed #primary-text',\n error: 'dashed #danger',\n },\n cursor: '$pointer',\n preset: {\n '': 't3',\n 'size=large': 't2',\n },\n height: {\n '': '5x',\n 'size=small': '4x',\n 'size=large': '6x',\n },\n boxSizing: 'border-box',\n\n Grid: {\n display: 'grid',\n flow: 'row',\n gridColumns: 'minmax(0, 1fr) min-content',\n placeContent: 'stretch',\n width: 'min 20x',\n radius: '1r',\n position: 'relative',\n },\n\n Shortcut: {\n display: {\n '': 'none',\n ':focus & !error': 'inline',\n },\n },\n },\n});\n\nconst CopyButton = tasty(Button, {\n type: 'clear',\n icon: <CopyIcon />,\n styles: {\n placeSelf: 'stretch',\n border: '#clear',\n shadow: {\n '': '0 0 0 1ow #purple-03.0 inset',\n focused: '0 0 0 1ow #purple-03 inset',\n },\n radius: {\n '': '0 1r 1r 0',\n 'multiline | has-scroll': '0 1r 0 0',\n },\n height: 'auto',\n outline: false,\n },\n});\n\nexport interface CubeCopyPasteBlockProps\n extends Omit<CubeCardProps, 'onPaste' | 'onCopy'>,\n PositionStyleProps {\n padding?: Styles['padding'];\n /** The code snippet */\n value?: string;\n placeholder?: ReactNode;\n /** The title of the snippet */\n title?: string;\n onPaste?: (text: string) => void | Promise<void | string>;\n onCopy?: () => void;\n size?: 'small' | 'medium' | 'large';\n}\n\nfunction CopyPasteBlock(\n allProps: CubeCopyPasteBlockProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n value = '',\n onPaste,\n placeholder,\n title,\n size = 'medium',\n ...props\n } = allProps;\n const styles = extractStyles(props, POSITION_STYLES);\n\n const { t } = useI18n();\n const [error, setError] = useState<string | null>(null);\n const toast = useToast();\n\n const { clipboardProps } = useClipboard({\n async onPaste(items) {\n let pasted = await Promise.all(\n items\n .filter(\n (item) => item.kind === 'text' && item.types.has('text/plain'),\n )\n .map((item) => (item as TextDropItem).getText('text/plain')),\n );\n try {\n await onPaste?.(pasted.join('\\n'));\n } catch (e) {\n setError(String(e));\n }\n },\n getItems() {\n return value\n ? [\n {\n 'text/plain': value,\n },\n ]\n : [];\n },\n onCopy() {\n if (value) {\n toast.success(\n t('copyPasteBlock.copied', '{{title}} copied', {\n title: title || t('copyPasteBlock.defaultTitle', 'Text'),\n }),\n );\n }\n },\n });\n\n useTimer({\n delay: 1000,\n callback() {\n setError(null);\n },\n isDisabled: !error,\n });\n\n async function onCopy() {\n await copy(value);\n\n toast.success(\n t('copyPasteBlock.copied', '{{title}} copied', {\n title: title || t('copyPasteBlock.defaultTitle', 'Text'),\n }),\n );\n }\n\n const pristineValue = value.replace(/\\n/, ' ');\n\n return (\n <CopyPasteBlockElement\n ref={ref}\n mods={{ error: !!error }}\n data-size={size}\n styles={styles}\n tabIndex=\"0\"\n {...props}\n {...clipboardProps}\n >\n <div data-element=\"Grid\">\n <StyledBlock\n data-size={size}\n mods={{\n placeholder: !!placeholder || !value,\n }}\n >\n <div data-element=\"Label\">\n {error != null ? (\n error || t('copyPasteBlock.invalidData', 'Invalid data')\n ) : value ? (\n pristineValue\n ) : (\n <>\n {placeholder\n ? placeholder\n : t('copyPasteBlock.selectAndPaste', 'Select and paste')}\n </>\n )}\n </div>\n <span data-element=\"Shortcut\">\n <kbd>Cmd</kbd> + <kbd>V</kbd>\n </span>\n </StyledBlock>\n {value && !error && (\n <CopyButton\n size={size}\n aria-label={t(\n 'copyPasteBlock.copyToClipboard',\n 'Copy {{title}} to clipboard',\n {\n title: title || t('copyPasteBlock.defaultTitle', 'Text'),\n },\n )}\n onPress={onCopy}\n />\n )}\n </div>\n </CopyPasteBlockElement>\n );\n}\n\nconst _CopyPasteBlock = forwardRef(CopyPasteBlock);\n\n_CopyPasteBlock.displayName = 'CopyPasteBlock';\n\nexport { _CopyPasteBlock as CopyPasteBlock };\n"],"mappings":"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"}
@@ -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 { _Tooltip } from "../../overlays/Tooltip/Tooltip.js";
3
3
  import { TooltipTrigger } from "../../overlays/Tooltip/TooltipTrigger.js";
4
+ import { useI18n } from "../../../i18n/useI18n.js";
4
5
  import { CopyIcon } from "../../../icons/CopyIcon.js";
5
6
  import { EyeIcon } from "../../../icons/EyeIcon.js";
6
7
  import { EyeInvisibleIcon } from "../../../icons/EyeInvisibleIcon.js";
@@ -119,22 +120,20 @@ const ActionButton = tasty(Button, {
119
120
  }
120
121
  }
121
122
  });
122
- const CopyButton = tasty(ActionButton, {
123
- icon: /* @__PURE__ */ jsx(CopyIcon, {}),
124
- "aria-label": "Copy to clipboard"
125
- });
126
- const ShowButton = tasty(ActionButton, { "aria-label": "Show hidden parts" });
123
+ const CopyButton = tasty(ActionButton, { icon: /* @__PURE__ */ jsx(CopyIcon, {}) });
124
+ const ShowButton = tasty(ActionButton, {});
127
125
  const HIDDEN_SYMBOL = "•";
128
126
  function replaceSymbolsToHidden(str) {
129
127
  return HIDDEN_SYMBOL.repeat(str.length);
130
128
  }
131
129
  function CopySnippet(allProps) {
132
- const { code = "", title = "Code example", nowrap, prefix = "", language, serif, actions, showTooltip = false, hideText, ...props } = allProps;
130
+ const { t } = useI18n();
131
+ const { code = "", title = t("copySnippet.title", "Code example"), nowrap, prefix = "", language, serif, actions, showTooltip = false, hideText, ...props } = allProps;
133
132
  const toast = useToast();
134
133
  const [showHidden, setShowHidden] = useState(false);
135
134
  async function onCopy() {
136
135
  await copy(code);
137
- toast.success(`${title} copied`);
136
+ toast.success(t("copySnippet.copied", "{{title}} copied", { title }));
138
137
  }
139
138
  const pristineCode = code.replace(/\n$/, "");
140
139
  const multiline = pristineCode.includes("\n") && !nowrap;
@@ -178,10 +177,11 @@ function CopySnippet(allProps) {
178
177
  mods,
179
178
  children: [
180
179
  /* @__PURE__ */ jsx(CopyButton, {
181
- "aria-label": `Copy ${title}`,
180
+ "aria-label": t("copySnippet.copyToClipboard", "Copy {{title}} to clipboard", { title }),
182
181
  onPress: onCopy
183
182
  }),
184
183
  hideText && /* @__PURE__ */ jsx(ShowButton, {
184
+ "aria-label": t("copySnippet.showHiddenParts", "Show hidden parts"),
185
185
  icon: showHidden ? /* @__PURE__ */ jsx(EyeInvisibleIcon, {}) : /* @__PURE__ */ jsx(EyeIcon, {}),
186
186
  onPress: () => setShowHidden(!showHidden)
187
187
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"CopySnippet.js","names":["PrismCode","Tooltip"],"sources":["../../../../src/components/content/CopySnippet/CopySnippet.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport copy from 'clipboard-copy';\nimport { ReactNode, useMemo, useState } from 'react';\n\nimport { CopyIcon, EyeIcon, EyeInvisibleIcon } from '../../../icons';\nimport { Action, Button } from '../../actions';\nimport {\n CubePrismCodeProps,\n PrismCode,\n} from '../../content/PrismCode/PrismCode';\nimport { useToast } from '../../overlays/Toast';\nimport { Tooltip } from '../../overlays/Tooltip/Tooltip';\nimport { TooltipTrigger } from '../../overlays/Tooltip/TooltipTrigger';\nimport { Card, CubeCardProps } from '../Card/Card';\n\nconst ActionElement = tasty(Action, {\n styles: {\n display: 'block',\n cursor: 'default',\n width: '100%',\n },\n});\n\nconst StyledBlock = tasty({\n styles: {\n position: 'relative',\n overflow: {\n '': 'auto clip',\n multiline: 'auto',\n },\n width: 'initial auto 100%',\n height: {\n '': 'max 5x',\n multiline: 'auto',\n },\n boxSizing: 'border-box',\n whiteSpace: {\n '': 'initial',\n nowrap: 'nowrap',\n },\n scrollbar: 'styled',\n padding: '1.125x 1.5x',\n fade: {\n '': 'right 2x',\n multiline: false,\n },\n\n Code: {\n $: 'code',\n font: {\n '': 'monospace',\n serif: true,\n },\n },\n },\n});\n\nconst ButtonContainer = tasty({\n styles: {\n position: 'relative',\n display: 'flex',\n flow: {\n '': 'row-reverse',\n multiline: 'column',\n },\n placeContent: 'start',\n\n '$button-size': {\n '': '5x',\n multiline: '4x',\n },\n\n '$first-button-radius': {\n '': '0 1r 1r 0',\n multiline: '0 1r 0 0',\n },\n\n '$last-button-radius': {\n '': '0',\n multiline: '0 0 0 1r',\n },\n\n '$first-and-last-button-radius': {\n '': '0 1r 1r 0',\n multiline: '0 1r 0 1r',\n },\n\n // Make sure there's a small gap between buttons and the content\n border: 'left #clear',\n },\n});\n\nconst CopySnippetElement = tasty(Card, {\n qa: 'CopySnippet',\n styles: {\n display: 'grid',\n gridRows: 'minmax(0, 1fr)',\n fill: '#surface-2',\n border: 0,\n padding: 0,\n preset: 'default',\n radius: '1r',\n overflow: 'hidden',\n height: 'max-content',\n\n Grid: {\n display: 'grid',\n flow: 'row',\n gridColumns: 'minmax(0, 1fr) auto',\n gridRows: 'minmax(0, 1fr)',\n width: 'min 20x',\n position: 'relative',\n },\n },\n});\n\nconst ActionButton = tasty(Button, {\n type: 'clear',\n styles: {\n width: '4x',\n padding: 0,\n placeSelf: 'stretch',\n border: '#clear',\n shadow: {\n '': 'inset 0 0 0 1ow #purple-03.0',\n focused: 'inset 0 0 0 1ow #purple-03',\n },\n outline: false,\n height: '$button-size',\n radius: {\n '': 0,\n ':last-child': '$last-button-radius',\n ':first-child': '$first-button-radius',\n ':first-child & :last-child': '$first-and-last-button-radius',\n },\n },\n});\n\nconst CopyButton = tasty(ActionButton, {\n icon: <CopyIcon />,\n 'aria-label': 'Copy to clipboard',\n});\n\nconst ShowButton = tasty(ActionButton, {\n 'aria-label': 'Show hidden parts',\n});\n\nexport interface CubeCopySnippetProps extends CubeCardProps {\n /** The code snippet */\n code: string;\n /** The title of the snippet */\n title?: string;\n /** Whether the snippet is single-lined */\n nowrap?: boolean;\n /** The prefix for each line of code. Useful for bash snippets. */\n prefix?: string;\n /** The code language of the snippet */\n language?: CubePrismCodeProps['language'];\n /** Whether the snippet uses a serif font */\n serif?: boolean;\n /** Whether to show the tooltip with the full content */\n showTooltip?: boolean;\n hideText?: string[] | string | boolean;\n actions?: ReactNode;\n}\n\n// const HIDDEN_SYMBOL = '●';\nconst HIDDEN_SYMBOL = '•';\n\nfunction replaceSymbolsToHidden(str: string) {\n return HIDDEN_SYMBOL.repeat(str.length);\n}\n\nfunction CopySnippet(allProps: CubeCopySnippetProps) {\n const {\n code = '',\n title = 'Code example',\n nowrap,\n prefix = '',\n language,\n serif,\n actions,\n showTooltip = false,\n hideText,\n ...props\n } = allProps;\n\n const toast = useToast();\n\n const [showHidden, setShowHidden] = useState(false);\n\n async function onCopy() {\n await copy(code);\n\n toast.success(`${title} copied`);\n }\n\n const pristineCode = code.replace(/\\n$/, '');\n\n const multiline = pristineCode.includes('\\n') && !nowrap;\n let formattedCode = pristineCode\n .replace(/\\r/g, '')\n .split(/\\n/g)\n .map((line) => `${prefix}${line}`)\n .join('\\n')\n .trim();\n\n if (!showHidden) {\n if (hideText === true) {\n formattedCode = replaceSymbolsToHidden(formattedCode);\n } else if (typeof hideText === 'string') {\n formattedCode = formattedCode.replaceAll(\n hideText,\n replaceSymbolsToHidden(hideText),\n );\n } else if (Array.isArray(hideText)) {\n hideText.forEach((text) => {\n formattedCode = formattedCode.replaceAll(\n text,\n replaceSymbolsToHidden(text),\n );\n });\n }\n }\n\n const mods = useMemo(() => {\n return {\n nowrap,\n multiline,\n serif,\n hidden: !!hideText,\n };\n }, [nowrap, multiline, hideText, serif]);\n\n const Snippet = (\n <CopySnippetElement mods={mods} {...props}>\n <div data-element=\"Grid\">\n <StyledBlock mods={mods}>\n <PrismCode\n style={{ margin: 0, overflow: 'visible' }}\n code={formattedCode}\n language={language || 'javascript'}\n />\n </StyledBlock>\n <ButtonContainer mods={mods}>\n <CopyButton aria-label={`Copy ${title}`} onPress={onCopy} />\n {hideText && (\n <ShowButton\n icon={showHidden ? <EyeInvisibleIcon /> : <EyeIcon />}\n onPress={() => setShowHidden(!showHidden)}\n />\n )}\n {actions}\n </ButtonContainer>\n </div>\n </CopySnippetElement>\n );\n\n if (showTooltip) {\n return (\n <TooltipTrigger>\n <ActionElement>{Snippet}</ActionElement>\n <Tooltip>{formattedCode}</Tooltip>\n </TooltipTrigger>\n );\n }\n\n return Snippet;\n}\n\nconst _CopySnippet = Object.assign(\n CopySnippet as typeof CopySnippet & {\n Button: typeof ActionButton;\n },\n {\n Button: ActionButton,\n },\n);\n\n(_CopySnippet as any).displayName = 'CopySnippet';\n\nexport { _CopySnippet as CopySnippet };\n"],"mappings":"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"}
1
+ {"version":3,"file":"CopySnippet.js","names":["PrismCode","Tooltip"],"sources":["../../../../src/components/content/CopySnippet/CopySnippet.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport copy from 'clipboard-copy';\nimport { ReactNode, useMemo, useState } from 'react';\n\nimport { useI18n } from '../../../i18n';\nimport { CopyIcon, EyeIcon, EyeInvisibleIcon } from '../../../icons';\nimport { Action, Button } from '../../actions';\nimport {\n CubePrismCodeProps,\n PrismCode,\n} from '../../content/PrismCode/PrismCode';\nimport { useToast } from '../../overlays/Toast';\nimport { Tooltip } from '../../overlays/Tooltip/Tooltip';\nimport { TooltipTrigger } from '../../overlays/Tooltip/TooltipTrigger';\nimport { Card, CubeCardProps } from '../Card/Card';\n\nconst ActionElement = tasty(Action, {\n styles: {\n display: 'block',\n cursor: 'default',\n width: '100%',\n },\n});\n\nconst StyledBlock = tasty({\n styles: {\n position: 'relative',\n overflow: {\n '': 'auto clip',\n multiline: 'auto',\n },\n width: 'initial auto 100%',\n height: {\n '': 'max 5x',\n multiline: 'auto',\n },\n boxSizing: 'border-box',\n whiteSpace: {\n '': 'initial',\n nowrap: 'nowrap',\n },\n scrollbar: 'styled',\n padding: '1.125x 1.5x',\n fade: {\n '': 'right 2x',\n multiline: false,\n },\n\n Code: {\n $: 'code',\n font: {\n '': 'monospace',\n serif: true,\n },\n },\n },\n});\n\nconst ButtonContainer = tasty({\n styles: {\n position: 'relative',\n display: 'flex',\n flow: {\n '': 'row-reverse',\n multiline: 'column',\n },\n placeContent: 'start',\n\n '$button-size': {\n '': '5x',\n multiline: '4x',\n },\n\n '$first-button-radius': {\n '': '0 1r 1r 0',\n multiline: '0 1r 0 0',\n },\n\n '$last-button-radius': {\n '': '0',\n multiline: '0 0 0 1r',\n },\n\n '$first-and-last-button-radius': {\n '': '0 1r 1r 0',\n multiline: '0 1r 0 1r',\n },\n\n // Make sure there's a small gap between buttons and the content\n border: 'left #clear',\n },\n});\n\nconst CopySnippetElement = tasty(Card, {\n qa: 'CopySnippet',\n styles: {\n display: 'grid',\n gridRows: 'minmax(0, 1fr)',\n fill: '#surface-2',\n border: 0,\n padding: 0,\n preset: 'default',\n radius: '1r',\n overflow: 'hidden',\n height: 'max-content',\n\n Grid: {\n display: 'grid',\n flow: 'row',\n gridColumns: 'minmax(0, 1fr) auto',\n gridRows: 'minmax(0, 1fr)',\n width: 'min 20x',\n position: 'relative',\n },\n },\n});\n\nconst ActionButton = tasty(Button, {\n type: 'clear',\n styles: {\n width: '4x',\n padding: 0,\n placeSelf: 'stretch',\n border: '#clear',\n shadow: {\n '': 'inset 0 0 0 1ow #purple-03.0',\n focused: 'inset 0 0 0 1ow #purple-03',\n },\n outline: false,\n height: '$button-size',\n radius: {\n '': 0,\n ':last-child': '$last-button-radius',\n ':first-child': '$first-button-radius',\n ':first-child & :last-child': '$first-and-last-button-radius',\n },\n },\n});\n\nconst CopyButton = tasty(ActionButton, {\n icon: <CopyIcon />,\n});\n\nconst ShowButton = tasty(ActionButton, {});\n\nexport interface CubeCopySnippetProps extends CubeCardProps {\n /** The code snippet */\n code: string;\n /** The title of the snippet */\n title?: string;\n /** Whether the snippet is single-lined */\n nowrap?: boolean;\n /** The prefix for each line of code. Useful for bash snippets. */\n prefix?: string;\n /** The code language of the snippet */\n language?: CubePrismCodeProps['language'];\n /** Whether the snippet uses a serif font */\n serif?: boolean;\n /** Whether to show the tooltip with the full content */\n showTooltip?: boolean;\n hideText?: string[] | string | boolean;\n actions?: ReactNode;\n}\n\n// const HIDDEN_SYMBOL = '●';\nconst HIDDEN_SYMBOL = '•';\n\nfunction replaceSymbolsToHidden(str: string) {\n return HIDDEN_SYMBOL.repeat(str.length);\n}\n\nfunction CopySnippet(allProps: CubeCopySnippetProps) {\n const { t } = useI18n();\n\n const {\n code = '',\n title = t('copySnippet.title', 'Code example'),\n nowrap,\n prefix = '',\n language,\n serif,\n actions,\n showTooltip = false,\n hideText,\n ...props\n } = allProps;\n\n const toast = useToast();\n\n const [showHidden, setShowHidden] = useState(false);\n\n async function onCopy() {\n await copy(code);\n\n toast.success(t('copySnippet.copied', '{{title}} copied', { title }));\n }\n\n const pristineCode = code.replace(/\\n$/, '');\n\n const multiline = pristineCode.includes('\\n') && !nowrap;\n let formattedCode = pristineCode\n .replace(/\\r/g, '')\n .split(/\\n/g)\n .map((line) => `${prefix}${line}`)\n .join('\\n')\n .trim();\n\n if (!showHidden) {\n if (hideText === true) {\n formattedCode = replaceSymbolsToHidden(formattedCode);\n } else if (typeof hideText === 'string') {\n formattedCode = formattedCode.replaceAll(\n hideText,\n replaceSymbolsToHidden(hideText),\n );\n } else if (Array.isArray(hideText)) {\n hideText.forEach((text) => {\n formattedCode = formattedCode.replaceAll(\n text,\n replaceSymbolsToHidden(text),\n );\n });\n }\n }\n\n const mods = useMemo(() => {\n return {\n nowrap,\n multiline,\n serif,\n hidden: !!hideText,\n };\n }, [nowrap, multiline, hideText, serif]);\n\n const Snippet = (\n <CopySnippetElement mods={mods} {...props}>\n <div data-element=\"Grid\">\n <StyledBlock mods={mods}>\n <PrismCode\n style={{ margin: 0, overflow: 'visible' }}\n code={formattedCode}\n language={language || 'javascript'}\n />\n </StyledBlock>\n <ButtonContainer mods={mods}>\n <CopyButton\n aria-label={t(\n 'copySnippet.copyToClipboard',\n 'Copy {{title}} to clipboard',\n { title },\n )}\n onPress={onCopy}\n />\n {hideText && (\n <ShowButton\n aria-label={t('copySnippet.showHiddenParts', 'Show hidden parts')}\n icon={showHidden ? <EyeInvisibleIcon /> : <EyeIcon />}\n onPress={() => setShowHidden(!showHidden)}\n />\n )}\n {actions}\n </ButtonContainer>\n </div>\n </CopySnippetElement>\n );\n\n if (showTooltip) {\n return (\n <TooltipTrigger>\n <ActionElement>{Snippet}</ActionElement>\n <Tooltip>{formattedCode}</Tooltip>\n </TooltipTrigger>\n );\n }\n\n return Snippet;\n}\n\nconst _CopySnippet = Object.assign(\n CopySnippet as typeof CopySnippet & {\n Button: typeof ActionButton;\n },\n {\n Button: ActionButton,\n },\n);\n\n(_CopySnippet as any).displayName = 'CopySnippet';\n\nexport { _CopySnippet as CopySnippet };\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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeRefs } from "../../../utils/react/useCombinedRefs.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 { useSlotProps } from "../../utils/react/Slots.js";
3
3
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
4
4
  import { BASE_STYLES, COLOR_STYLES, OUTER_STYLES, filterBaseProps, 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 { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { CONTAINER_STYLES, TEXT_STYLES, filterBaseProps, 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 { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { CONTAINER_STYLES, TEXT_STYLES, filterBaseProps, 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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { _Text } from "../Text.js";
4
4
  import { useKeySymbols } from "../../../utils/react/useKeySymbols.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 { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.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 } from "../../../utils/react/mergeProps.js";
3
3
  import { resolveIcon } from "../../../utils/react/resolveIcon.js";
4
4
  import { highlightText } from "../highlightText.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 } from "../../../utils/react/mergeProps.js";
3
3
  import { TooltipProvider } from "../../overlays/Tooltip/TooltipProvider.js";
4
4
  import { DANGER_CLEAR_STYLES, DANGER_OUTLINE_STYLES, DANGER_PRIMARY_STYLES, DEFAULT_CLEAR_STYLES, DEFAULT_OUTLINE_STYLES, DEFAULT_PRIMARY_STYLES, ITEM_ACTION_BASE_STYLES, SPECIAL_CLEAR_STYLES, SPECIAL_OUTLINE_STYLES, SPECIAL_PRIMARY_STYLES, SUCCESS_CLEAR_STYLES, SUCCESS_OUTLINE_STYLES, SUCCESS_PRIMARY_STYLES } from "../../../data/item-themes.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 { ItemAction } from "../../actions/ItemAction/ItemAction.js";
3
3
  import { _Item } from "../Item/Item.js";
4
4
  import { forwardRef } from "react";