@cube-dev/ui-kit 0.0.0-canary-1cd97ae → 0.0.0-canary-4396eae

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 (451) hide show
  1. package/dist/CHANGELOG.md +6 -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.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +17 -3
  20. package/dist/components/actions/Button/Button.js.map +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +3 -4
  25. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +18 -2
  30. package/dist/components/actions/ItemButton/ItemButton.js.map +1 -1
  31. package/dist/components/actions/Link/Link.js +1 -1
  32. package/dist/components/actions/Menu/Menu.js +3 -4
  33. package/dist/components/actions/Menu/Menu.js.map +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 +8 -5
  37. package/dist/components/actions/Menu/MenuTrigger.js.map +1 -1
  38. package/dist/components/actions/Menu/SubMenuTrigger.js +10 -7
  39. package/dist/components/actions/Menu/SubMenuTrigger.js.map +1 -1
  40. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  41. package/dist/components/actions/Menu/context.js +1 -1
  42. package/dist/components/actions/Menu/styled.js +1 -1
  43. package/dist/components/actions/index.js +1 -1
  44. package/dist/components/actions/use-action.js +1 -1
  45. package/dist/components/actions/use-anchored-menu.js +4 -3
  46. package/dist/components/actions/use-anchored-menu.js.map +1 -1
  47. package/dist/components/actions/use-context-menu.js +4 -3
  48. package/dist/components/actions/use-context-menu.js.map +1 -1
  49. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  50. package/dist/components/content/Alert/Alert.js +1 -1
  51. package/dist/components/content/Alert/use-alert.js +1 -1
  52. package/dist/components/content/Avatar/Avatar.js +1 -1
  53. package/dist/components/content/Badge/Badge.js +1 -1
  54. package/dist/components/content/Card/Card.js +1 -1
  55. package/dist/components/content/Content.js +1 -1
  56. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  57. package/dist/components/content/CopySnippet/CopySnippet.js +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 +1 -1
  78. package/dist/components/content/Layout/LayoutPane.js +1 -1
  79. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  80. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  81. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  82. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  83. package/dist/components/content/Layout/index.js +1 -1
  84. package/dist/components/content/Layout/utils.js +1 -1
  85. package/dist/components/content/Paragraph.js +1 -1
  86. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  87. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  88. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  89. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  90. package/dist/components/content/Result/Result.js +1 -1
  91. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  92. package/dist/components/content/Tag/Tag.js +1 -1
  93. package/dist/components/content/Text.js +1 -1
  94. package/dist/components/content/TextItem/TextItem.js +1 -1
  95. package/dist/components/content/Title.js +1 -1
  96. package/dist/components/content/Tree/Tree.js +1 -1
  97. package/dist/components/content/Tree/TreeNode.js +1 -1
  98. package/dist/components/content/Tree/styled.js +1 -1
  99. package/dist/components/content/Tree/tree-index.js +1 -1
  100. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  101. package/dist/components/content/Tree/use-load-data.js +1 -1
  102. package/dist/components/content/highlightText.js +1 -1
  103. package/dist/components/content/use-auto-tooltip.js +1 -1
  104. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  105. package/dist/components/fields/Checkbox/CheckboxGroup.js +3 -3
  106. package/dist/components/fields/Checkbox/CheckboxGroup.js.map +1 -1
  107. package/dist/components/fields/Checkbox/context.js +1 -1
  108. package/dist/components/fields/ComboBox/ComboBox.js +11 -7
  109. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  110. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  111. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  112. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  113. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  114. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  115. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  116. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  117. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  118. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  119. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  120. package/dist/components/fields/DatePicker/intl.js +1 -1
  121. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  122. package/dist/components/fields/DatePicker/props.js +1 -1
  123. package/dist/components/fields/DatePicker/utils.js +1 -1
  124. package/dist/components/fields/FileInput/FileInput.js +1 -1
  125. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  126. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -9
  127. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  128. package/dist/components/fields/Input/Input.js +1 -1
  129. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  130. package/dist/components/fields/ListBox/ListBox.js +1 -1
  131. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  132. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  133. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  134. package/dist/components/fields/Picker/Picker.js +1 -9
  135. package/dist/components/fields/Picker/Picker.js.map +1 -1
  136. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  137. package/dist/components/fields/RadioGroup/RadioGroup.js +3 -3
  138. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  139. package/dist/components/fields/RadioGroup/context.js +1 -1
  140. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  141. package/dist/components/fields/Select/Select.js +10 -7
  142. package/dist/components/fields/Select/Select.js.map +1 -1
  143. package/dist/components/fields/Slider/Gradation.js +1 -1
  144. package/dist/components/fields/Slider/HueSlider.js +1 -1
  145. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  146. package/dist/components/fields/Slider/Slider.js +1 -1
  147. package/dist/components/fields/Slider/SliderBase.js +1 -1
  148. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  149. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  150. package/dist/components/fields/Slider/elements.js +1 -1
  151. package/dist/components/fields/Slider/index.js +1 -1
  152. package/dist/components/fields/Switch/Switch.js +1 -1
  153. package/dist/components/fields/TextArea/TextArea.js +1 -1
  154. package/dist/components/fields/TextInput/TextInput.js +1 -1
  155. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  156. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  157. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  158. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  159. package/dist/components/form/Form/Field.js +1 -1
  160. package/dist/components/form/Form/Form.d.ts +1 -2
  161. package/dist/components/form/Form/Form.js +3 -3
  162. package/dist/components/form/Form/Form.js.map +1 -1
  163. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  164. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  165. package/dist/components/form/Form/SubmitError.js +1 -1
  166. package/dist/components/form/Form/index.d.ts +1 -1
  167. package/dist/components/form/Form/index.js +1 -1
  168. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  169. package/dist/components/form/Form/use-field/use-field.js +1 -1
  170. package/dist/components/form/Form/use-form.js +1 -1
  171. package/dist/components/form/Form/validation.js +1 -1
  172. package/dist/components/form/Label.js +3 -3
  173. package/dist/components/form/Label.js.map +1 -1
  174. package/dist/components/form/wrapper.js +1 -1
  175. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  176. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  177. package/dist/components/layout/Flex.js +1 -1
  178. package/dist/components/layout/Flow.js +1 -1
  179. package/dist/components/layout/Grid.js +1 -1
  180. package/dist/components/layout/Panel.js +1 -1
  181. package/dist/components/layout/Prefix.js +1 -1
  182. package/dist/components/layout/ResizablePanel.js +1 -1
  183. package/dist/components/layout/Space.js +1 -1
  184. package/dist/components/layout/Suffix.js +1 -1
  185. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  186. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  187. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  188. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  189. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  190. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  191. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  192. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  193. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  194. package/dist/components/navigation/Tabs/styled.js +1 -1
  195. package/dist/components/navigation/Tabs/types.js +1 -1
  196. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  197. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  198. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  199. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  200. package/dist/components/other/Calendar/Calendar.js +1 -1
  201. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  202. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  203. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  204. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  205. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  206. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  207. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  208. package/dist/components/overlays/Dialog/Dialog.d.ts +1 -2
  209. package/dist/components/overlays/Dialog/Dialog.js +3 -3
  210. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  211. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  212. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  213. package/dist/components/overlays/Dialog/DialogTrigger.js +32 -3
  214. package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
  215. package/dist/components/overlays/Dialog/context.js +1 -1
  216. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  217. package/dist/components/overlays/Modal/Modal.js +3 -3
  218. package/dist/components/overlays/Modal/Modal.js.map +1 -1
  219. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  220. package/dist/components/overlays/Modal/Overlay.js +1 -1
  221. package/dist/components/overlays/Modal/Popover.js +1 -1
  222. package/dist/components/overlays/Modal/Tray.js +3 -3
  223. package/dist/components/overlays/Modal/Tray.js.map +1 -1
  224. package/dist/components/overlays/Modal/Underlay.js +1 -1
  225. package/dist/components/overlays/Notifications/Notification.js +1 -1
  226. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  227. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  228. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  229. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  230. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  231. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  232. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  233. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  234. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  235. package/dist/components/overlays/Notifications/index.js +1 -1
  236. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  237. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  238. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  239. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  240. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  241. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  242. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  243. package/dist/components/overlays/Toast/index.js +1 -1
  244. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  245. package/dist/components/overlays/Toast/useToast.js +1 -1
  246. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  247. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  248. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  249. package/dist/components/overlays/Tooltip/context.js +1 -1
  250. package/dist/components/portal/Portal.js +1 -1
  251. package/dist/components/portal/PortalProvider.js +1 -1
  252. package/dist/components/portal/usePortal.js +1 -1
  253. package/dist/components/shared/DraggableCollection.js +1 -1
  254. package/dist/components/shared/InvalidIcon.js +1 -1
  255. package/dist/components/shared/ValidIcon.js +1 -1
  256. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  257. package/dist/components/status/Spin/Cube.js +1 -1
  258. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  259. package/dist/components/status/Spin/Spin.js +1 -1
  260. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  261. package/dist/data/item-themes.js +1 -1
  262. package/dist/data/themes.js +1 -1
  263. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  264. package/dist/icons/AdjustmentsIcon.js +1 -1
  265. package/dist/icons/AiIcon.js +1 -1
  266. package/dist/icons/AreaChartIcon.js +1 -1
  267. package/dist/icons/BackwardIcon.js +1 -1
  268. package/dist/icons/BarChartIcon.js +1 -1
  269. package/dist/icons/BellFilledIcon.js +1 -1
  270. package/dist/icons/BellIcon.js +1 -1
  271. package/dist/icons/BooleanIcon.js +1 -1
  272. package/dist/icons/CalendarEditIcon.js +1 -1
  273. package/dist/icons/CalendarIcon.js +1 -1
  274. package/dist/icons/CaretDownIcon.js +1 -1
  275. package/dist/icons/CaretUpIcon.js +1 -1
  276. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  277. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  278. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  279. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  280. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  281. package/dist/icons/ChartBarLineIcon.js +1 -1
  282. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  283. package/dist/icons/ChartBarStackedIcon.js +1 -1
  284. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  285. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  286. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  287. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  288. package/dist/icons/ChartBubbleIcon.js +1 -1
  289. package/dist/icons/ChartDonut2Icon.js +1 -1
  290. package/dist/icons/ChartFunnelIcon.js +1 -1
  291. package/dist/icons/ChartHeatmapIcon.js +1 -1
  292. package/dist/icons/ChartKPIIcon.js +1 -1
  293. package/dist/icons/ChartPie2Icon.js +1 -1
  294. package/dist/icons/ChartScatterIcon.js +1 -1
  295. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  296. package/dist/icons/CheckCircleIcon.js +1 -1
  297. package/dist/icons/CheckIcon.js +1 -1
  298. package/dist/icons/CircleFilledIcon.js +1 -1
  299. package/dist/icons/ClearIcon.js +1 -1
  300. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  301. package/dist/icons/CloseCircleIcon.js +1 -1
  302. package/dist/icons/CloseIcon.js +1 -1
  303. package/dist/icons/CodeIcon.js +1 -1
  304. package/dist/icons/ColumnTotalIcon.js +1 -1
  305. package/dist/icons/CopyIcon.js +1 -1
  306. package/dist/icons/CountIcon.js +1 -1
  307. package/dist/icons/CubeIcon.js +1 -1
  308. package/dist/icons/CubePauseIcon.js +1 -1
  309. package/dist/icons/CubePlayIcon.js +1 -1
  310. package/dist/icons/CurrencyDollarIcon.js +1 -1
  311. package/dist/icons/DangerIcon.js +1 -1
  312. package/dist/icons/DashboardIcon.js +1 -1
  313. package/dist/icons/DatabaseIcon.js +1 -1
  314. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  315. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  316. package/dist/icons/DirectionIcon.js +1 -1
  317. package/dist/icons/DonutIcon.js +1 -1
  318. package/dist/icons/DownIcon.js +1 -1
  319. package/dist/icons/EditIcon.js +1 -1
  320. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  321. package/dist/icons/ExclamationCircleIcon.js +1 -1
  322. package/dist/icons/ExclamationIcon.js +1 -1
  323. package/dist/icons/EyeIcon.js +1 -1
  324. package/dist/icons/EyeInvisibleIcon.js +1 -1
  325. package/dist/icons/FilterIcon.js +1 -1
  326. package/dist/icons/FolderFilledIcon.js +1 -1
  327. package/dist/icons/FolderIcon.js +1 -1
  328. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  329. package/dist/icons/FolderOpenIcon.js +1 -1
  330. package/dist/icons/ForwardIcon.js +1 -1
  331. package/dist/icons/GripVerticalIcon.js +1 -1
  332. package/dist/icons/HierarchyIcon.js +1 -1
  333. package/dist/icons/HierarchyOpenIcon.js +1 -1
  334. package/dist/icons/Icon.js +1 -1
  335. package/dist/icons/InfoCircleIcon.js +1 -1
  336. package/dist/icons/InfoIcon.js +1 -1
  337. package/dist/icons/KeyIcon.js +1 -1
  338. package/dist/icons/LeftIcon.js +1 -1
  339. package/dist/icons/LineChartIcon.js +1 -1
  340. package/dist/icons/LoadingIcon.js +1 -1
  341. package/dist/icons/LockFilledIcon.js +1 -1
  342. package/dist/icons/LockIcon.js +1 -1
  343. package/dist/icons/MoreIcon.js +1 -1
  344. package/dist/icons/NotAllowedIcon.js +1 -1
  345. package/dist/icons/Number123Icon.js +1 -1
  346. package/dist/icons/NumberIcon.js +1 -1
  347. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  348. package/dist/icons/PauseCircleIcon.js +1 -1
  349. package/dist/icons/PauseIcon.js +1 -1
  350. package/dist/icons/PercentageIcon.js +1 -1
  351. package/dist/icons/PieChartIcon.js +1 -1
  352. package/dist/icons/PlayCircleIcon.js +1 -1
  353. package/dist/icons/PlayIcon.js +1 -1
  354. package/dist/icons/PlusIcon.js +1 -1
  355. package/dist/icons/ProgressBarIcon.js +1 -1
  356. package/dist/icons/ReloadIcon.js +1 -1
  357. package/dist/icons/ReportIcon.js +1 -1
  358. package/dist/icons/ReturnIcon.js +1 -1
  359. package/dist/icons/RightIcon.js +1 -1
  360. package/dist/icons/RowTotalsIcon.js +1 -1
  361. package/dist/icons/SchemeIcon.js +1 -1
  362. package/dist/icons/SearchIcon.js +1 -1
  363. package/dist/icons/SemanticQueryIcon.js +1 -1
  364. package/dist/icons/SettingsIcon.js +1 -1
  365. package/dist/icons/ShieldFilledIcon.js +1 -1
  366. package/dist/icons/ShieldIcon.js +1 -1
  367. package/dist/icons/SlashIcon.js +1 -1
  368. package/dist/icons/SparklesIcon.js +1 -1
  369. package/dist/icons/SqlIcon.js +1 -1
  370. package/dist/icons/StatsIcon.js +1 -1
  371. package/dist/icons/StopIcon.js +1 -1
  372. package/dist/icons/StringIcon.js +1 -1
  373. package/dist/icons/SubtotalsIcon.js +1 -1
  374. package/dist/icons/SwitchIcon.js +1 -1
  375. package/dist/icons/TableIcon.js +1 -1
  376. package/dist/icons/ThumbsDownIcon.js +1 -1
  377. package/dist/icons/ThumbsUpIcon.js +1 -1
  378. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  379. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  380. package/dist/icons/ThunderboltIcon.js +1 -1
  381. package/dist/icons/TimeIcon.js +1 -1
  382. package/dist/icons/TrashIcon.js +1 -1
  383. package/dist/icons/UnlockIcon.js +1 -1
  384. package/dist/icons/UpIcon.js +1 -1
  385. package/dist/icons/UserGroupIcon.js +1 -1
  386. package/dist/icons/UserIcon.js +1 -1
  387. package/dist/icons/UserLockIcon.js +1 -1
  388. package/dist/icons/ViewIcon.js +1 -1
  389. package/dist/icons/WarningFilledIcon.js +1 -1
  390. package/dist/icons/WarningIcon.js +1 -1
  391. package/dist/icons/wrap-icon.js +1 -1
  392. package/dist/index.d.ts +2 -1
  393. package/dist/index.js +3 -2
  394. package/dist/index.js.map +1 -1
  395. package/dist/provider.js +1 -1
  396. package/dist/providers/TrackingProvider.js +1 -1
  397. package/dist/providers/navigationAdapter.default.js +1 -1
  398. package/dist/tokens/base.js +1 -1
  399. package/dist/tokens/colors.js +1 -1
  400. package/dist/tokens/index.js +1 -1
  401. package/dist/tokens/layout.js +1 -1
  402. package/dist/tokens/palette.js +1 -1
  403. package/dist/tokens/shadows.js +1 -1
  404. package/dist/tokens/sizes.js +1 -1
  405. package/dist/tokens/spacing.js +1 -1
  406. package/dist/tokens/typography.js +1 -1
  407. package/dist/utils/ResizeSensor.js +1 -1
  408. package/dist/utils/index.d.ts +1 -0
  409. package/dist/utils/is-dev-env.js +1 -1
  410. package/dist/utils/modules.js +1 -1
  411. package/dist/utils/promise.js +1 -1
  412. package/dist/utils/raf.js +1 -1
  413. package/dist/utils/random.js +1 -1
  414. package/dist/utils/range.js +1 -1
  415. package/dist/utils/react/RenderCache.js +1 -1
  416. package/dist/utils/react/Slots.js +1 -1
  417. package/dist/utils/react/chain.js +1 -1
  418. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  419. package/dist/utils/react/index.d.ts +1 -0
  420. package/dist/utils/react/index.js +2 -1
  421. package/dist/utils/react/interactions.js +1 -1
  422. package/dist/utils/react/isTextOnly.js +1 -1
  423. package/dist/utils/react/mapProps.js +1 -1
  424. package/dist/utils/react/mergeProps.js +1 -1
  425. package/dist/utils/react/nullableValue.js +1 -1
  426. package/dist/utils/react/resolveIcon.js +1 -1
  427. package/dist/utils/react/sharedStore.js +1 -1
  428. package/dist/utils/react/useCombinedRefs.js +1 -1
  429. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  430. package/dist/utils/react/useEventBus.js +25 -15
  431. package/dist/utils/react/useEventBus.js.map +1 -1
  432. package/dist/utils/react/useId.js +1 -1
  433. package/dist/utils/react/useIsDarwin.js +1 -1
  434. package/dist/utils/react/useKeySymbols.js +1 -1
  435. package/dist/utils/react/useLayoutEffect.js +1 -1
  436. package/dist/utils/react/useLocalStorage.js +1 -1
  437. package/dist/utils/react/useMergeStyles.js +1 -1
  438. package/dist/utils/react/usePopoverSync.d.ts +105 -0
  439. package/dist/utils/react/usePopoverSync.js +70 -9
  440. package/dist/utils/react/usePopoverSync.js.map +1 -1
  441. package/dist/utils/react/useQaProps.js +1 -1
  442. package/dist/utils/react/useViewportSize.js +1 -1
  443. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  444. package/dist/utils/selection.js +1 -1
  445. package/dist/utils/styles.js +1 -1
  446. package/dist/utils/tree.js +1 -1
  447. package/dist/utils/warnings.js +1 -1
  448. package/dist/version.js +2 -2
  449. package/docs/components/actions/Button.md +102 -24
  450. package/docs/components/actions/ItemButton.md +71 -34
  451. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useEventBus.js","names":[],"sources":["../../../src/utils/react/useEventBus.ts"],"sourcesContent":["import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n} from 'react';\n\nexport type EventBusListener<T = any> = (data: T) => void;\n\nexport interface EventBusContextValue {\n emit: <T = any>(event: string, data?: T) => void;\n emitSync: <T = any>(event: string, data?: T) => void;\n on: <T = any>(event: string, listener: EventBusListener<T>) => () => void;\n off: <T = any>(event: string, listener: EventBusListener<T>) => void;\n}\n\nconst EventBusContext = createContext<EventBusContextValue | null>(null);\n\nexport interface EventBusProviderProps {\n children: ReactNode;\n}\n\n/**\n * EventBusProvider provides a global event system for the application.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <EventBusProvider>\n * <YourComponents />\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function EventBusProvider({ children }: EventBusProviderProps) {\n const listeners = useRef<Record<string, EventBusListener[]>>({});\n\n const off = useCallback(\n <T = any>(event: string, listener: EventBusListener<T>) => {\n const eventListeners = listeners.current[event];\n if (eventListeners) {\n listeners.current[event] = eventListeners.filter((l) => l !== listener);\n\n // Clean up empty event arrays\n if (listeners.current[event].length === 0) {\n delete listeners.current[event];\n }\n }\n },\n [],\n );\n\n const emitSync = useCallback(<T = any>(event: string, data?: T) => {\n const eventListeners = listeners.current[event];\n if (eventListeners) {\n eventListeners.forEach((listener) => listener(data));\n }\n }, []);\n\n const emit = useCallback(<T = any>(event: string, data?: T) => {\n // Use setTimeout to ensure async emission after current render cycle\n setTimeout(() => {\n emitSync(event, data);\n }, 0);\n }, []);\n\n const on = useCallback(\n <T = any>(event: string, listener: EventBusListener<T>) => {\n if (!listeners.current[event]) {\n listeners.current[event] = [];\n }\n listeners.current[event].push(listener);\n\n // Return cleanup function\n return () => {\n off(event, listener);\n };\n },\n [off],\n );\n\n const contextValue: EventBusContextValue = {\n emit,\n emitSync,\n on,\n off,\n };\n\n return React.createElement(\n EventBusContext.Provider,\n { value: contextValue },\n children,\n );\n}\n\n/**\n * Hook to access the event bus functionality.\n * Must be used within an EventBusProvider.\n *\n * @example\n * ```tsx\n * function Component() {\n * const { emit, emitSync, on } = useEventBus();\n *\n * const handleClick = () => {\n * emit('user-action', { type: 'click', target: 'button' });\n * };\n *\n * const handleSyncAction = () => {\n * emitSync('sync-action', { immediate: true });\n * };\n *\n * useEffect(() => {\n * const unsubscribe = on('data-updated', (data) => {\n * console.log('Data updated:', data);\n * });\n *\n * return unsubscribe;\n * }, [on]);\n *\n * return (\n * <div>\n * <button onClick={handleClick}>Async Event</button>\n * <button onClick={handleSyncAction}>Sync Event</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useEventBus(): EventBusContextValue {\n const context = useContext(EventBusContext);\n\n if (!context) {\n throw new Error('useEventBus must be used within an EventBusProvider');\n }\n\n return context;\n}\n\n/**\n * Convenience hook for subscribing to events with automatic cleanup.\n * The listener will be automatically unsubscribed when the component unmounts\n * or when the dependencies change.\n *\n * @param event - The event name to listen for\n * @param listener - The callback function to execute when the event is emitted\n * @param deps - Dependency array for the effect (similar to useEffect)\n *\n * @example\n * ```tsx\n * function NotificationComponent() {\n * const [message, setMessage] = useState('');\n *\n * useEventListener('notification', (data) => {\n * setMessage(data.message);\n * }, []);\n *\n * return <div>{message}</div>;\n * }\n * ```\n */\nexport function useEventListener<T = any>(\n event: string,\n listener: EventBusListener<T>,\n deps: React.DependencyList = [],\n) {\n const { on } = useEventBus();\n\n useEffect(() => {\n const unsubscribe = on(event, listener);\n return unsubscribe;\n }, [event, on, ...deps]);\n}\n"],"mappings":";;;;AAkBA,MAAM,kBAAkB,cAA2C,KAAK;;;;;;;;;;;;;;;AAoBxE,SAAgB,iBAAiB,EAAE,YAAmC;CACpE,MAAM,YAAY,OAA2C,EAAE,CAAC;CAEhE,MAAM,MAAM,aACA,OAAe,aAAkC;EACzD,MAAM,iBAAiB,UAAU,QAAQ;AACzC,MAAI,gBAAgB;AAClB,aAAU,QAAQ,SAAS,eAAe,QAAQ,MAAM,MAAM,SAAS;AAGvE,OAAI,UAAU,QAAQ,OAAO,WAAW,EACtC,QAAO,UAAU,QAAQ;;IAI/B,EAAE,CACH;CAED,MAAM,WAAW,aAAsB,OAAe,SAAa;EACjE,MAAM,iBAAiB,UAAU,QAAQ;AACzC,MAAI,eACF,gBAAe,SAAS,aAAa,SAAS,KAAK,CAAC;IAErD,EAAE,CAAC;CAwBN,MAAM,eAAqC;EACzC,MAvBW,aAAsB,OAAe,SAAa;AAE7D,oBAAiB;AACf,aAAS,OAAO,KAAK;MACpB,EAAE;KACJ,EAAE,CAAC;EAmBJ;EACA,IAlBS,aACC,OAAe,aAAkC;AACzD,OAAI,CAAC,UAAU,QAAQ,OACrB,WAAU,QAAQ,SAAS,EAAE;AAE/B,aAAU,QAAQ,OAAO,KAAK,SAAS;AAGvC,gBAAa;AACX,QAAI,OAAO,SAAS;;KAGxB,CAAC,IAAI,CACN;EAMC;EACD;AAED,QAAO,MAAM,cACX,gBAAgB,UAChB,EAAE,OAAO,cAAc,EACvB,SACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCH,SAAgB,cAAoC;CAClD,MAAM,UAAU,WAAW,gBAAgB;AAE3C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,SAAgB,iBACd,OACA,UACA,OAA6B,EAAE,EAC/B;CACA,MAAM,EAAE,OAAO,aAAa;AAE5B,iBAAgB;AAEd,SADoB,GAAG,OAAO,SAAS;IAEtC;EAAC;EAAO;EAAI,GAAG;EAAK,CAAC"}
1
+ {"version":3,"file":"useEventBus.js","names":[],"sources":["../../../src/utils/react/useEventBus.ts"],"sourcesContent":["import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n} from 'react';\n\nexport type EventBusListener<T = any> = (data: T) => void;\n\nexport interface EventBusContextValue {\n emit: <T = any>(event: string, data?: T) => void;\n emitSync: <T = any>(event: string, data?: T) => void;\n on: <T = any>(event: string, listener: EventBusListener<T>) => () => void;\n off: <T = any>(event: string, listener: EventBusListener<T>) => void;\n}\n\nexport const EventBusContext = createContext<EventBusContextValue | null>(null);\n\nexport interface EventBusProviderProps {\n children: ReactNode;\n}\n\n/**\n * EventBusProvider provides a global event system for the application.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <EventBusProvider>\n * <YourComponents />\n * </EventBusProvider>\n * );\n * }\n * ```\n */\nexport function EventBusProvider({ children }: EventBusProviderProps) {\n // If we're already inside a parent EventBusProvider (e.g. the global Root\n // one), DO NOT create a fresh bus — that would isolate listeners and\n // emitters across the boundary. This matters because overlays (Popover,\n // Modal, Tray) re-wrap their content with our `Provider` from\n // `provider.tsx`, which transparently nests an EventBusProvider. Cross-\n // overlay events such as `popover:dismiss-ancestor` (a Button inside a\n // popover footer dismissing the popover host) only work when both sides\n // share the same bus.\n const parentBus = useContext(EventBusContext);\n\n const listeners = useRef<Record<string, EventBusListener[]>>({});\n\n const off = useCallback(\n <T = any>(event: string, listener: EventBusListener<T>) => {\n const eventListeners = listeners.current[event];\n if (eventListeners) {\n listeners.current[event] = eventListeners.filter((l) => l !== listener);\n\n // Clean up empty event arrays\n if (listeners.current[event].length === 0) {\n delete listeners.current[event];\n }\n }\n },\n [],\n );\n\n const emitSync = useCallback(<T = any>(event: string, data?: T) => {\n const eventListeners = listeners.current[event];\n if (eventListeners) {\n eventListeners.forEach((listener) => listener(data));\n }\n }, []);\n\n const emit = useCallback(\n <T = any>(event: string, data?: T) => {\n setTimeout(() => {\n emitSync(event, data);\n }, 0);\n },\n [emitSync],\n );\n\n const on = useCallback(\n <T = any>(event: string, listener: EventBusListener<T>) => {\n if (!listeners.current[event]) {\n listeners.current[event] = [];\n }\n listeners.current[event].push(listener);\n\n // Return cleanup function\n return () => {\n off(event, listener);\n };\n },\n [off],\n );\n\n // Always compute the local contextValue so hook order stays stable, then\n // pick parent OR local. (`useMemo` keeps the local one stable for any\n // descendants that DO end up using it.)\n\n const localContextValue = useRef<EventBusContextValue>({\n emit,\n emitSync,\n on,\n off,\n });\n localContextValue.current = { emit, emitSync, on, off };\n\n const contextValue = parentBus ?? localContextValue.current;\n\n return React.createElement(\n EventBusContext.Provider,\n { value: contextValue },\n children,\n );\n}\n\n/**\n * Hook to access the event bus functionality.\n * Must be used within an EventBusProvider.\n *\n * @example\n * ```tsx\n * function Component() {\n * const { emit, emitSync, on } = useEventBus();\n *\n * const handleClick = () => {\n * emit('user-action', { type: 'click', target: 'button' });\n * };\n *\n * const handleSyncAction = () => {\n * emitSync('sync-action', { immediate: true });\n * };\n *\n * useEffect(() => {\n * const unsubscribe = on('data-updated', (data) => {\n * console.log('Data updated:', data);\n * });\n *\n * return unsubscribe;\n * }, [on]);\n *\n * return (\n * <div>\n * <button onClick={handleClick}>Async Event</button>\n * <button onClick={handleSyncAction}>Sync Event</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useEventBus(): EventBusContextValue {\n const context = useContext(EventBusContext);\n\n if (!context) {\n throw new Error('useEventBus must be used within an EventBusProvider');\n }\n\n return context;\n}\n\n/**\n * Convenience hook for subscribing to events with automatic cleanup.\n * The listener will be automatically unsubscribed when the component unmounts\n * or when the dependencies change.\n *\n * @param event - The event name to listen for\n * @param listener - The callback function to execute when the event is emitted\n * @param deps - Dependency array for the effect (similar to useEffect)\n *\n * @example\n * ```tsx\n * function NotificationComponent() {\n * const [message, setMessage] = useState('');\n *\n * useEventListener('notification', (data) => {\n * setMessage(data.message);\n * }, []);\n *\n * return <div>{message}</div>;\n * }\n * ```\n */\nexport function useEventListener<T = any>(\n event: string,\n listener: EventBusListener<T>,\n deps: React.DependencyList = [],\n) {\n const { on } = useEventBus();\n\n useEffect(() => {\n const unsubscribe = on(event, listener);\n return unsubscribe;\n }, [event, on, ...deps]);\n}\n"],"mappings":";;;;AAkBA,MAAa,kBAAkB,cAA2C,KAAK;;;;;;;;;;;;;;;AAoB/E,SAAgB,iBAAiB,EAAE,YAAmC;CASpE,MAAM,YAAY,WAAW,gBAAgB;CAE7C,MAAM,YAAY,OAA2C,EAAE,CAAC;CAEhE,MAAM,MAAM,aACA,OAAe,aAAkC;EACzD,MAAM,iBAAiB,UAAU,QAAQ;AACzC,MAAI,gBAAgB;AAClB,aAAU,QAAQ,SAAS,eAAe,QAAQ,MAAM,MAAM,SAAS;AAGvE,OAAI,UAAU,QAAQ,OAAO,WAAW,EACtC,QAAO,UAAU,QAAQ;;IAI/B,EAAE,CACH;CAED,MAAM,WAAW,aAAsB,OAAe,SAAa;EACjE,MAAM,iBAAiB,UAAU,QAAQ;AACzC,MAAI,eACF,gBAAe,SAAS,aAAa,SAAS,KAAK,CAAC;IAErD,EAAE,CAAC;CAEN,MAAM,OAAO,aACD,OAAe,SAAa;AACpC,mBAAiB;AACf,YAAS,OAAO,KAAK;KACpB,EAAE;IAEP,CAAC,SAAS,CACX;CAED,MAAM,KAAK,aACC,OAAe,aAAkC;AACzD,MAAI,CAAC,UAAU,QAAQ,OACrB,WAAU,QAAQ,SAAS,EAAE;AAE/B,YAAU,QAAQ,OAAO,KAAK,SAAS;AAGvC,eAAa;AACX,OAAI,OAAO,SAAS;;IAGxB,CAAC,IAAI,CACN;CAMD,MAAM,oBAAoB,OAA6B;EACrD;EACA;EACA;EACA;EACD,CAAC;AACF,mBAAkB,UAAU;EAAE;EAAM;EAAU;EAAI;EAAK;CAEvD,MAAM,eAAe,aAAa,kBAAkB;AAEpD,QAAO,MAAM,cACX,gBAAgB,UAChB,EAAE,OAAO,cAAc,EACvB,SACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCH,SAAgB,cAAoC;CAClD,MAAM,UAAU,WAAW,gBAAgB;AAE3C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAO;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,SAAgB,iBACd,OACA,UACA,OAA6B,EAAE,EAC/B;CACA,MAAM,EAAE,OAAO,aAAa;AAE5B,iBAAgB;AAEd,SADoB,GAAG,OAAO,SAAS;IAEtC;EAAC;EAAO;EAAI,GAAG;EAAK,CAAC"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { useLayoutEffect as useLayoutEffect$1 } from "./useLayoutEffect.js";
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import { useSSRSafeId } from "@react-aria/ssr";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { useEffect, useState } from "react";
3
3
 
4
4
  //#region src/utils/react/useIsDarwin.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { useIsDarwin } from "./useIsDarwin.js";
3
3
  import { useMemo } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import * as React$1 from "react";
3
3
 
4
4
  //#region src/utils/react/useLayoutEffect.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { useEvent } from "../../_internal/hooks/use-event.js";
3
3
  import { useCallback, useSyncExternalStore } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { mergeStyles } from "@tenphi/tasty";
3
3
  import { useMemo } from "react";
4
4
 
@@ -0,0 +1,105 @@
1
+
2
+ import { RefObject } from "react";
3
+
4
+ //#region src/utils/react/usePopoverSync.d.ts
5
+ interface UsePopoverSyncOptions {
6
+ /** Stable identifier for this popover instance (typically a generateRandomId() memo). */
7
+ menuId: string;
8
+ /** Current open state of this popover. */
9
+ isOpen: boolean;
10
+ /** Called when another popover opens while this one is open. */
11
+ onClose: () => void;
12
+ /**
13
+ * When `false`, this popover does not participate in the sync (no listening,
14
+ * no emitting). Useful for "dummy" triggers that proxy a real one (see
15
+ * `MenuTrigger`'s `isDummy`). Defaults to `true`.
16
+ */
17
+ enabled?: boolean;
18
+ /**
19
+ * Ref to the popover's trigger element. When provided, the element is
20
+ * included in the `popover:open` emit payload so peers can detect whether
21
+ * the new opener is nested inside their own overlay (and skip closing in
22
+ * that case). Optional — omitting it preserves the legacy "always close on
23
+ * peer open" behaviour.
24
+ */
25
+ triggerRef?: RefObject<HTMLElement | null>;
26
+ /**
27
+ * Ref to the overlay/container element that hosts this popover's content.
28
+ * When provided, the listener performs a DOM `contains()` check on incoming
29
+ * peer triggers: peers whose trigger lives inside this container are
30
+ * considered nested children and do NOT close us.
31
+ */
32
+ containerRef?: RefObject<HTMLElement | null>;
33
+ /**
34
+ * Whether this overlay closes when a Button/ItemButton inside its container
35
+ * is pressed. Defaults to `true` (popover semantics — popovers are transient
36
+ * surfaces and any action inside them should dismiss them). Set to `false`
37
+ * for modals/trays/fullscreen dialogs — buttons inside a Dialog should not
38
+ * auto-close it. Requires `containerRef` to be set; without it the listener
39
+ * has no way to determine whether the dispatching button is "inside" this
40
+ * overlay and is effectively a no-op.
41
+ */
42
+ dismissOnInnerButtonPress?: boolean;
43
+ }
44
+ /**
45
+ * Coordinates the "only one popover open at a time" invariant via the EventBus.
46
+ *
47
+ * - When `isOpen` flips `false -> true`, emits `popover:open` once.
48
+ * - While open, listens for peers' `popover:open` events and calls `onClose`.
49
+ *
50
+ * Implementation notes (ALL of these matter — losing any one re-introduces a
51
+ * race that surfaces only under rapid trigger switching, which is hard to
52
+ * reproduce in tests):
53
+ *
54
+ * 1. `isOpen` and `onClose` are read through refs inside the listener, so the
55
+ * subscription effect's dep array does NOT include `isOpen`/`onClose`. This
56
+ * keeps the listener identity stable across open/close transitions and
57
+ * avoids the unsubscribe-emit-resubscribe window where an emit can be
58
+ * delivered to a stale listener (or no listener).
59
+ * 2. The emit fires only on the `false -> true` transition, gated by
60
+ * `wasOpenRef`. A re-render where `isOpen` is still `true` must NOT
61
+ * re-emit, otherwise it could re-trigger listeners on peers that just
62
+ * opened in the same render flush.
63
+ * 3. The `enabled` flag short-circuits both effects symmetrically. When it
64
+ * flips off, `wasOpenRef` is reset so re-enabling later still emits if
65
+ * `isOpen` is true at that moment.
66
+ */
67
+ declare function usePopoverSync({
68
+ menuId,
69
+ isOpen,
70
+ onClose,
71
+ enabled,
72
+ triggerRef,
73
+ containerRef,
74
+ dismissOnInnerButtonPress
75
+ }: UsePopoverSyncOptions): void;
76
+ /**
77
+ * Hook that returns a dispatcher to close the popover that contains a given
78
+ * DOM element. Used by `Button` / `ItemButton` to implement the default
79
+ * "press inside a popover closes the popover" behaviour. Custom (non-Cube)
80
+ * interactive controls can call this directly:
81
+ *
82
+ * ```tsx
83
+ * const dismiss = useDismissParentPopover();
84
+ * <MyCustomPressable onPress={(e) => { doThing(); dismiss(e.currentTarget); }} />
85
+ * ```
86
+ *
87
+ * The actual dismiss is dispatched through the EventBus, which defers via
88
+ * `setTimeout(0)` — so the user's synchronous handler (and any React state
89
+ * updates it triggers) flushes BEFORE the popover closes. This is critical
90
+ * for the "open a hoisted modal from a popover footer" case: the modal
91
+ * mounts first, then the popover closes.
92
+ *
93
+ * Only popover-type containers (those that pass `dismissOnInnerButtonPress`
94
+ * as `true`, the default) react to the event. Modal/tray/fullscreen Dialog
95
+ * containers explicitly opt out so a Button inside their content does not
96
+ * auto-close them.
97
+ *
98
+ * When called outside an `EventBusProvider` (e.g. in unit tests that render
99
+ * a Button without wrapping in `<Root>`), the returned function is a no-op —
100
+ * the dismiss flow gracefully degrades rather than throwing.
101
+ */
102
+ declare function useDismissParentPopover(): (from: Element | null) => void;
103
+ //#endregion
104
+ export { UsePopoverSyncOptions, useDismissParentPopover, usePopoverSync };
105
+ //# sourceMappingURL=usePopoverSync.d.ts.map
@@ -1,6 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
2
- import { useEventBus } from "./useEventBus.js";
3
- import { useEffect, useRef } from "react";
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
+ import { EventBusContext, useEventBus } from "./useEventBus.js";
3
+ import { useCallback, useContext, useEffect, useRef } from "react";
4
4
 
5
5
  //#region src/utils/react/usePopoverSync.ts
6
6
  /**
@@ -26,7 +26,7 @@ import { useEffect, useRef } from "react";
26
26
  * flips off, `wasOpenRef` is reset so re-enabling later still emits if
27
27
  * `isOpen` is true at that moment.
28
28
  */
29
- function usePopoverSync({ menuId, isOpen, onClose, enabled = true }) {
29
+ function usePopoverSync({ menuId, isOpen, onClose, enabled = true, triggerRef, containerRef, dismissOnInnerButtonPress = true }) {
30
30
  const { emit, on } = useEventBus();
31
31
  const isOpenRef = useRef(isOpen);
32
32
  useEffect(() => {
@@ -36,15 +36,40 @@ function usePopoverSync({ menuId, isOpen, onClose, enabled = true }) {
36
36
  useEffect(() => {
37
37
  onCloseRef.current = onClose;
38
38
  }, [onClose]);
39
+ const containerRefRef = useRef(containerRef);
40
+ useEffect(() => {
41
+ containerRefRef.current = containerRef;
42
+ }, [containerRef]);
43
+ const triggerRefRef = useRef(triggerRef);
44
+ useEffect(() => {
45
+ triggerRefRef.current = triggerRef;
46
+ }, [triggerRef]);
39
47
  useEffect(() => {
40
48
  if (!enabled) return;
41
- return on("popover:open", (data) => {
42
- if (data.menuId !== menuId && isOpenRef.current) onCloseRef.current();
49
+ const offOpen = on("popover:open", (data) => {
50
+ if (data.menuId === menuId || !isOpenRef.current) return;
51
+ const container = containerRefRef.current?.current;
52
+ const triggerEl = data.triggerEl;
53
+ if (container && triggerEl && container.contains(triggerEl)) return;
54
+ onCloseRef.current();
55
+ });
56
+ if (!dismissOnInnerButtonPress) return offOpen;
57
+ const offDismiss = on("popover:dismiss-ancestor", (data) => {
58
+ if (!isOpenRef.current) return;
59
+ const container = containerRefRef.current?.current;
60
+ const from = data?.from;
61
+ if (!container || !from) return;
62
+ if (container.contains(from)) onCloseRef.current();
43
63
  });
64
+ return () => {
65
+ offOpen();
66
+ offDismiss();
67
+ };
44
68
  }, [
45
69
  on,
46
70
  menuId,
47
- enabled
71
+ enabled,
72
+ dismissOnInnerButtonPress
48
73
  ]);
49
74
  const wasOpenRef = useRef(false);
50
75
  useEffect(() => {
@@ -54,7 +79,10 @@ function usePopoverSync({ menuId, isOpen, onClose, enabled = true }) {
54
79
  }
55
80
  if (isOpen && !wasOpenRef.current) {
56
81
  wasOpenRef.current = true;
57
- emit("popover:open", { menuId });
82
+ emit("popover:open", {
83
+ menuId,
84
+ triggerEl: triggerRefRef.current?.current ?? null
85
+ });
58
86
  } else if (!isOpen) wasOpenRef.current = false;
59
87
  }, [
60
88
  isOpen,
@@ -63,7 +91,40 @@ function usePopoverSync({ menuId, isOpen, onClose, enabled = true }) {
63
91
  enabled
64
92
  ]);
65
93
  }
94
+ /**
95
+ * Hook that returns a dispatcher to close the popover that contains a given
96
+ * DOM element. Used by `Button` / `ItemButton` to implement the default
97
+ * "press inside a popover closes the popover" behaviour. Custom (non-Cube)
98
+ * interactive controls can call this directly:
99
+ *
100
+ * ```tsx
101
+ * const dismiss = useDismissParentPopover();
102
+ * <MyCustomPressable onPress={(e) => { doThing(); dismiss(e.currentTarget); }} />
103
+ * ```
104
+ *
105
+ * The actual dismiss is dispatched through the EventBus, which defers via
106
+ * `setTimeout(0)` — so the user's synchronous handler (and any React state
107
+ * updates it triggers) flushes BEFORE the popover closes. This is critical
108
+ * for the "open a hoisted modal from a popover footer" case: the modal
109
+ * mounts first, then the popover closes.
110
+ *
111
+ * Only popover-type containers (those that pass `dismissOnInnerButtonPress`
112
+ * as `true`, the default) react to the event. Modal/tray/fullscreen Dialog
113
+ * containers explicitly opt out so a Button inside their content does not
114
+ * auto-close them.
115
+ *
116
+ * When called outside an `EventBusProvider` (e.g. in unit tests that render
117
+ * a Button without wrapping in `<Root>`), the returned function is a no-op —
118
+ * the dismiss flow gracefully degrades rather than throwing.
119
+ */
120
+ function useDismissParentPopover() {
121
+ const emit = useContext(EventBusContext)?.emit;
122
+ return useCallback((from) => {
123
+ if (!from || !emit) return;
124
+ emit("popover:dismiss-ancestor", { from });
125
+ }, [emit]);
126
+ }
66
127
 
67
128
  //#endregion
68
- export { usePopoverSync };
129
+ export { useDismissParentPopover, usePopoverSync };
69
130
  //# sourceMappingURL=usePopoverSync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePopoverSync.js","names":[],"sources":["../../../src/utils/react/usePopoverSync.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { useEventBus } from './useEventBus';\n\nexport interface UsePopoverSyncOptions {\n /** Stable identifier for this popover instance (typically a generateRandomId() memo). */\n menuId: string;\n /** Current open state of this popover. */\n isOpen: boolean;\n /** Called when another popover opens while this one is open. */\n onClose: () => void;\n /**\n * When `false`, this popover does not participate in the sync (no listening,\n * no emitting). Useful for \"dummy\" triggers that proxy a real one (see\n * `MenuTrigger`'s `isDummy`). Defaults to `true`.\n */\n enabled?: boolean;\n}\n\n/**\n * Coordinates the \"only one popover open at a time\" invariant via the EventBus.\n *\n * - When `isOpen` flips `false -> true`, emits `popover:open` once.\n * - While open, listens for peers' `popover:open` events and calls `onClose`.\n *\n * Implementation notes (ALL of these matter — losing any one re-introduces a\n * race that surfaces only under rapid trigger switching, which is hard to\n * reproduce in tests):\n *\n * 1. `isOpen` and `onClose` are read through refs inside the listener, so the\n * subscription effect's dep array does NOT include `isOpen`/`onClose`. This\n * keeps the listener identity stable across open/close transitions and\n * avoids the unsubscribe-emit-resubscribe window where an emit can be\n * delivered to a stale listener (or no listener).\n * 2. The emit fires only on the `false -> true` transition, gated by\n * `wasOpenRef`. A re-render where `isOpen` is still `true` must NOT\n * re-emit, otherwise it could re-trigger listeners on peers that just\n * opened in the same render flush.\n * 3. The `enabled` flag short-circuits both effects symmetrically. When it\n * flips off, `wasOpenRef` is reset so re-enabling later still emits if\n * `isOpen` is true at that moment.\n */\nexport function usePopoverSync({\n menuId,\n isOpen,\n onClose,\n enabled = true,\n}: UsePopoverSyncOptions): void {\n const { emit, on } = useEventBus();\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n\n useEffect(() => {\n if (!enabled) return;\n return on('popover:open', (data: { menuId: string }) => {\n if (data.menuId !== menuId && isOpenRef.current) {\n onCloseRef.current();\n }\n });\n }, [on, menuId, enabled]);\n\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (!enabled) {\n wasOpenRef.current = false;\n return;\n }\n if (isOpen && !wasOpenRef.current) {\n wasOpenRef.current = true;\n emit('popover:open', { menuId });\n } else if (!isOpen) {\n wasOpenRef.current = false;\n }\n }, [isOpen, emit, menuId, enabled]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,eAAe,EAC7B,QACA,QACA,SACA,UAAU,QACoB;CAC9B,MAAM,EAAE,MAAM,OAAO,aAAa;CAElC,MAAM,YAAY,OAAO,OAAO;AAChC,iBAAgB;AACd,YAAU,UAAU;IACnB,CAAC,OAAO,CAAC;CAEZ,MAAM,aAAa,OAAO,QAAQ;AAClC,iBAAgB;AACd,aAAW,UAAU;IACpB,CAAC,QAAQ,CAAC;AAEb,iBAAgB;AACd,MAAI,CAAC,QAAS;AACd,SAAO,GAAG,iBAAiB,SAA6B;AACtD,OAAI,KAAK,WAAW,UAAU,UAAU,QACtC,YAAW,SAAS;IAEtB;IACD;EAAC;EAAI;EAAQ;EAAQ,CAAC;CAEzB,MAAM,aAAa,OAAO,MAAM;AAChC,iBAAgB;AACd,MAAI,CAAC,SAAS;AACZ,cAAW,UAAU;AACrB;;AAEF,MAAI,UAAU,CAAC,WAAW,SAAS;AACjC,cAAW,UAAU;AACrB,QAAK,gBAAgB,EAAE,QAAQ,CAAC;aACvB,CAAC,OACV,YAAW,UAAU;IAEtB;EAAC;EAAQ;EAAM;EAAQ;EAAQ,CAAC"}
1
+ {"version":3,"file":"usePopoverSync.js","names":[],"sources":["../../../src/utils/react/usePopoverSync.ts"],"sourcesContent":["import { RefObject, useCallback, useContext, useEffect, useRef } from 'react';\n\nimport { EventBusContext, useEventBus } from './useEventBus';\n\nexport interface UsePopoverSyncOptions {\n /** Stable identifier for this popover instance (typically a generateRandomId() memo). */\n menuId: string;\n /** Current open state of this popover. */\n isOpen: boolean;\n /** Called when another popover opens while this one is open. */\n onClose: () => void;\n /**\n * When `false`, this popover does not participate in the sync (no listening,\n * no emitting). Useful for \"dummy\" triggers that proxy a real one (see\n * `MenuTrigger`'s `isDummy`). Defaults to `true`.\n */\n enabled?: boolean;\n /**\n * Ref to the popover's trigger element. When provided, the element is\n * included in the `popover:open` emit payload so peers can detect whether\n * the new opener is nested inside their own overlay (and skip closing in\n * that case). Optional — omitting it preserves the legacy \"always close on\n * peer open\" behaviour.\n */\n triggerRef?: RefObject<HTMLElement | null>;\n /**\n * Ref to the overlay/container element that hosts this popover's content.\n * When provided, the listener performs a DOM `contains()` check on incoming\n * peer triggers: peers whose trigger lives inside this container are\n * considered nested children and do NOT close us.\n */\n containerRef?: RefObject<HTMLElement | null>;\n /**\n * Whether this overlay closes when a Button/ItemButton inside its container\n * is pressed. Defaults to `true` (popover semantics — popovers are transient\n * surfaces and any action inside them should dismiss them). Set to `false`\n * for modals/trays/fullscreen dialogs — buttons inside a Dialog should not\n * auto-close it. Requires `containerRef` to be set; without it the listener\n * has no way to determine whether the dispatching button is \"inside\" this\n * overlay and is effectively a no-op.\n */\n dismissOnInnerButtonPress?: boolean;\n}\n\ninterface PopoverOpenPayload {\n menuId: string;\n triggerEl: Element | null;\n}\n\ninterface PopoverDismissAncestorPayload {\n /** The DOM node of the button that requested the dismiss. */\n from: Element | null;\n}\n\n/**\n * Coordinates the \"only one popover open at a time\" invariant via the EventBus.\n *\n * - When `isOpen` flips `false -> true`, emits `popover:open` once.\n * - While open, listens for peers' `popover:open` events and calls `onClose`.\n *\n * Implementation notes (ALL of these matter — losing any one re-introduces a\n * race that surfaces only under rapid trigger switching, which is hard to\n * reproduce in tests):\n *\n * 1. `isOpen` and `onClose` are read through refs inside the listener, so the\n * subscription effect's dep array does NOT include `isOpen`/`onClose`. This\n * keeps the listener identity stable across open/close transitions and\n * avoids the unsubscribe-emit-resubscribe window where an emit can be\n * delivered to a stale listener (or no listener).\n * 2. The emit fires only on the `false -> true` transition, gated by\n * `wasOpenRef`. A re-render where `isOpen` is still `true` must NOT\n * re-emit, otherwise it could re-trigger listeners on peers that just\n * opened in the same render flush.\n * 3. The `enabled` flag short-circuits both effects symmetrically. When it\n * flips off, `wasOpenRef` is reset so re-enabling later still emits if\n * `isOpen` is true at that moment.\n */\nexport function usePopoverSync({\n menuId,\n isOpen,\n onClose,\n enabled = true,\n triggerRef,\n containerRef,\n dismissOnInnerButtonPress = true,\n}: UsePopoverSyncOptions): void {\n const { emit, on } = useEventBus();\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n\n // Track the latest containerRef via a stable ref-of-refs so the listener\n // never resubscribes when callers pass freshly-created ref wrappers across\n // renders. Same pattern as `onCloseRef` above — without this the listener's\n // effect would churn for any caller that doesn't memoize its refs.\n const containerRefRef = useRef(containerRef);\n useEffect(() => {\n containerRefRef.current = containerRef;\n }, [containerRef]);\n\n const triggerRefRef = useRef(triggerRef);\n useEffect(() => {\n triggerRefRef.current = triggerRef;\n }, [triggerRef]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const offOpen = on('popover:open', (data: PopoverOpenPayload) => {\n if (data.menuId === menuId || !isOpenRef.current) return;\n const container = containerRefRef.current?.current;\n const triggerEl = data.triggerEl;\n // Nested-popover guard: if the peer's trigger lives inside our own\n // overlay, treat the open as a child interaction and stay open.\n if (container && triggerEl && container.contains(triggerEl)) return;\n onCloseRef.current();\n });\n\n // `popover:dismiss-ancestor` is emitted by `Button` / `ItemButton` (and any\n // consumer using `useDismissParentPopover`) after their `onPress` runs.\n // Only popover-type overlays subscribe; modals/trays opt out via\n // `dismissOnInnerButtonPress: false` so a Button inside a Dialog content\n // does NOT auto-close the Dialog.\n if (!dismissOnInnerButtonPress) {\n return offOpen;\n }\n\n const offDismiss = on(\n 'popover:dismiss-ancestor',\n (data: PopoverDismissAncestorPayload) => {\n if (!isOpenRef.current) return;\n const container = containerRefRef.current?.current;\n const from = data?.from;\n // Require both a container and an originating element so we can do\n // the contains-check. Hosts without `containerRef` (e.g.\n // `use-anchored-menu`, `use-context-menu`) are silently no-op.\n if (!container || !from) return;\n if (container.contains(from)) onCloseRef.current();\n },\n );\n\n return () => {\n offOpen();\n offDismiss();\n };\n }, [on, menuId, enabled, dismissOnInnerButtonPress]);\n\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (!enabled) {\n wasOpenRef.current = false;\n return;\n }\n if (isOpen && !wasOpenRef.current) {\n wasOpenRef.current = true;\n emit<PopoverOpenPayload>('popover:open', {\n menuId,\n triggerEl: triggerRefRef.current?.current ?? null,\n });\n } else if (!isOpen) {\n wasOpenRef.current = false;\n }\n }, [isOpen, emit, menuId, enabled]);\n}\n\n/**\n * Hook that returns a dispatcher to close the popover that contains a given\n * DOM element. Used by `Button` / `ItemButton` to implement the default\n * \"press inside a popover closes the popover\" behaviour. Custom (non-Cube)\n * interactive controls can call this directly:\n *\n * ```tsx\n * const dismiss = useDismissParentPopover();\n * <MyCustomPressable onPress={(e) => { doThing(); dismiss(e.currentTarget); }} />\n * ```\n *\n * The actual dismiss is dispatched through the EventBus, which defers via\n * `setTimeout(0)` — so the user's synchronous handler (and any React state\n * updates it triggers) flushes BEFORE the popover closes. This is critical\n * for the \"open a hoisted modal from a popover footer\" case: the modal\n * mounts first, then the popover closes.\n *\n * Only popover-type containers (those that pass `dismissOnInnerButtonPress`\n * as `true`, the default) react to the event. Modal/tray/fullscreen Dialog\n * containers explicitly opt out so a Button inside their content does not\n * auto-close them.\n *\n * When called outside an `EventBusProvider` (e.g. in unit tests that render\n * a Button without wrapping in `<Root>`), the returned function is a no-op —\n * the dismiss flow gracefully degrades rather than throwing.\n */\nexport function useDismissParentPopover() {\n // Read context defensively: `Button` / `ItemButton` use this hook\n // unconditionally, but tests (and standalone usages outside `<Root>`) may\n // mount them without an `EventBusProvider`. A throw would crash every\n // Button render in those cases.\n const bus = useContext(EventBusContext);\n const emit = bus?.emit;\n return useCallback(\n (from: Element | null) => {\n if (!from || !emit) return;\n emit<PopoverDismissAncestorPayload>('popover:dismiss-ancestor', { from });\n },\n [emit],\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6EA,SAAgB,eAAe,EAC7B,QACA,QACA,SACA,UAAU,MACV,YACA,cACA,4BAA4B,QACE;CAC9B,MAAM,EAAE,MAAM,OAAO,aAAa;CAElC,MAAM,YAAY,OAAO,OAAO;AAChC,iBAAgB;AACd,YAAU,UAAU;IACnB,CAAC,OAAO,CAAC;CAEZ,MAAM,aAAa,OAAO,QAAQ;AAClC,iBAAgB;AACd,aAAW,UAAU;IACpB,CAAC,QAAQ,CAAC;CAMb,MAAM,kBAAkB,OAAO,aAAa;AAC5C,iBAAgB;AACd,kBAAgB,UAAU;IACzB,CAAC,aAAa,CAAC;CAElB,MAAM,gBAAgB,OAAO,WAAW;AACxC,iBAAgB;AACd,gBAAc,UAAU;IACvB,CAAC,WAAW,CAAC;AAEhB,iBAAgB;AACd,MAAI,CAAC,QAAS;EAEd,MAAM,UAAU,GAAG,iBAAiB,SAA6B;AAC/D,OAAI,KAAK,WAAW,UAAU,CAAC,UAAU,QAAS;GAClD,MAAM,YAAY,gBAAgB,SAAS;GAC3C,MAAM,YAAY,KAAK;AAGvB,OAAI,aAAa,aAAa,UAAU,SAAS,UAAU,CAAE;AAC7D,cAAW,SAAS;IACpB;AAOF,MAAI,CAAC,0BACH,QAAO;EAGT,MAAM,aAAa,GACjB,6BACC,SAAwC;AACvC,OAAI,CAAC,UAAU,QAAS;GACxB,MAAM,YAAY,gBAAgB,SAAS;GAC3C,MAAM,OAAO,MAAM;AAInB,OAAI,CAAC,aAAa,CAAC,KAAM;AACzB,OAAI,UAAU,SAAS,KAAK,CAAE,YAAW,SAAS;IAErD;AAED,eAAa;AACX,YAAS;AACT,eAAY;;IAEb;EAAC;EAAI;EAAQ;EAAS;EAA0B,CAAC;CAEpD,MAAM,aAAa,OAAO,MAAM;AAChC,iBAAgB;AACd,MAAI,CAAC,SAAS;AACZ,cAAW,UAAU;AACrB;;AAEF,MAAI,UAAU,CAAC,WAAW,SAAS;AACjC,cAAW,UAAU;AACrB,QAAyB,gBAAgB;IACvC;IACA,WAAW,cAAc,SAAS,WAAW;IAC9C,CAAC;aACO,CAAC,OACV,YAAW,UAAU;IAEtB;EAAC;EAAQ;EAAM;EAAQ;EAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BrC,SAAgB,0BAA0B;CAMxC,MAAM,OADM,WAAW,gBAAgB,EACrB;AAClB,QAAO,aACJ,SAAyB;AACxB,MAAI,CAAC,QAAQ,CAAC,KAAM;AACpB,OAAoC,4BAA4B,EAAE,MAAM,CAAC;IAE3E,CAAC,KAAK,CACP"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/utils/react/useQaProps.ts
3
3
  /**
4
4
  * Processes QA props.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { useEffect, useState } from "react";
3
3
 
4
4
  //#region src/utils/react/useViewportSize.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  import { isValidElement } from "react";
3
3
  import { isFragment } from "react-is";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/utils/selection.ts
3
3
  /**
4
4
  * Deduplicate/toggle keys in a selection: if a key appears twice it is
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/utils/styles.ts
3
3
  /**
4
4
  * Split properties into style and non-style properties.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/utils/tree.ts
3
3
  function toFlatTree(tree, includingFolders) {
4
4
  return tree.reduce((result, node) => {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/utils/warnings.ts
3
3
  const SUGGESTED_PROP_MAP = {
4
4
  disabled: "isDisabled",
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-1cd97ae | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-4396eae | Cube Dev Team */
2
2
  //#region src/version.ts
3
- const VERSION = "0.0.0-canary-1cd97ae";
3
+ const VERSION = "0.0.0-canary-4396eae";
4
4
  const TASTY_VERSION = "2.6.2";
5
5
  if (typeof window !== "undefined") {
6
6
  const version = VERSION;
@@ -41,6 +41,7 @@ Supports [Base properties](../../BaseProperties.md)
41
41
  Customises the root element of the component.
42
42
 
43
43
  **Sub-elements:**
44
+
44
45
  - `Icon` – wrapper around the leading icon
45
46
  - `RightIcon` – wrapper around the trailing icon
46
47
  - `Label` – the button text content
@@ -114,27 +115,35 @@ The `mods` prop accepts the following modifiers you can override:
114
115
  ```jsx
115
116
  import { IconPlus } from '@tabler/icons-react';
116
117
 
117
- {/* Standard icon */}
118
- <Button icon={<IconPlus />} aria-label="Add item" />
119
-
120
- {/* Empty slot (reserves space but shows nothing) */}
121
- <Button icon={true} aria-label="Empty slot" />
122
-
123
- {/* Dynamic icon based on mods */}
124
- <Button
125
- icon={({ loading }) => loading ? <SpinnerIcon /> : <IconPlus />}
118
+ {
119
+ /* Standard icon */
120
+ }
121
+ <Button icon={<IconPlus />} aria-label="Add item" />;
122
+
123
+ {
124
+ /* Empty slot (reserves space but shows nothing) */
125
+ }
126
+ <Button icon={true} aria-label="Empty slot" />;
127
+
128
+ {
129
+ /* Dynamic icon based on mods */
130
+ }
131
+ <Button
132
+ icon={({ loading }) => (loading ? <SpinnerIcon /> : <IconPlus />)}
126
133
  aria-label="Dynamic icon"
127
134
  >
128
135
  Save
129
- </Button>
136
+ </Button>;
130
137
 
131
- {/* Return true from function for empty slot */}
132
- <Button
133
- icon={({ selected }) => selected ? <CheckIcon /> : true}
138
+ {
139
+ /* Return true from function for empty slot */
140
+ }
141
+ <Button
142
+ icon={({ selected }) => (selected ? <CheckIcon /> : true)}
134
143
  aria-label="Conditional icon"
135
144
  >
136
145
  Option
137
- </Button>
146
+ </Button>;
138
147
  ```
139
148
 
140
149
  ### Link Button
@@ -159,21 +168,31 @@ import { IconPlus } from '@tabler/icons-react';
159
168
  ### With Tooltip
160
169
 
161
170
  ```jsx
162
- {/* Simple tooltip text */}
163
- <Button icon={<IconPlus />} tooltip="Add new item" aria-label="Add" />
164
-
165
- {/* Auto tooltip on overflow */}
166
- <Button tooltip={true} width="100px">This text will be truncated</Button>
171
+ {
172
+ /* Simple tooltip text */
173
+ }
174
+ <Button icon={<IconPlus />} tooltip="Add new item" aria-label="Add" />;
175
+
176
+ {
177
+ /* Auto tooltip on overflow */
178
+ }
179
+ <Button tooltip={true} width="100px">
180
+ This text will be truncated
181
+ </Button>;
167
182
  ```
168
183
 
169
184
  ### Custom Size
170
185
 
171
186
  ```jsx
172
- {/* Using a number (pixels) */}
173
- <Button size={64}>Large Custom</Button>
174
-
175
- {/* Using a string multiplier */}
176
- <Button size="8x">8x Size</Button>
187
+ {
188
+ /* Using a number (pixels) */
189
+ }
190
+ <Button size={64}>Large Custom</Button>;
191
+
192
+ {
193
+ /* Using a string multiplier */
194
+ }
195
+ <Button size="8x">8x Size</Button>;
177
196
  ```
178
197
 
179
198
  ## Accessibility
@@ -195,6 +214,65 @@ import { IconPlus } from '@tabler/icons-react';
195
214
  - `aria-pressed` – Managed automatically when `isSelected` is used.
196
215
  - Additional ARIA attributes supported by React Aria's `useButton`.
197
216
 
217
+ ## Behaviour Inside Popovers
218
+
219
+ By default, pressing a `Button` inside an open popover (any overlay that
220
+ uses `usePopoverSync` — including the popovers rendered by `FilterPicker`,
221
+ `Picker`, `ComboBox`, `Select`, `MenuTrigger`, and
222
+ `DialogTrigger type="popover"`) **dismisses that popover** after the user's
223
+ `onPress` runs. This matches the common UX where a popover is a transient
224
+ surface: any action inside it should close it.
225
+
226
+ Modal / tray / fullscreen Dialogs are **not** affected — a Button inside a
227
+ modal Dialog does not auto-close it.
228
+
229
+ ### Opt-outs
230
+
231
+ There are three ways to keep the popover open when a Button is pressed:
232
+
233
+ 1. **Automatic for popover triggers.** Buttons that act as popover triggers
234
+ already carry `data-popover-trigger` (applied by `MenuTrigger`,
235
+ `DialogTrigger type="popover"`, `FilterPicker`, `Picker`, `ComboBox`,
236
+ `Select`). Modal-type `DialogTrigger` children are **not** marked, so they
237
+ correctly dismiss the parent popover and let the modal take over.
238
+ 2. **Manual via `data-popover-keep`.** Add the attribute to the button
239
+ (toggle case) or to any ancestor element (subtree case — useful when a
240
+ custom inline editor inside a popover footer should not collapse on
241
+ every interaction):
242
+
243
+ ```jsx
244
+ <Button data-popover-keep onPress={() => setMode((m) => !m)}>
245
+ Toggle
246
+ </Button>
247
+
248
+ <div data-popover-keep>
249
+ {/* All Buttons inside this wrapper opt out. */}
250
+ </div>
251
+ ```
252
+
253
+ 3. **Custom non-Cube triggers.** Call `useDismissParentPopover()` yourself if
254
+ your control should dismiss the popover but does not extend `Button` /
255
+ `ItemButton`:
256
+ ```jsx
257
+ const dismiss = useDismissParentPopover();
258
+ <MyCustomPressable
259
+ onPress={(e) => {
260
+ doThing();
261
+ dismiss(e.currentTarget);
262
+ }}
263
+ />;
264
+ ```
265
+
266
+ ### Async `onPress`
267
+
268
+ The dismiss is dispatched via the EventBus, which defers with `setTimeout(0)`.
269
+ This means synchronous `onPress` handlers (and any React state updates they
270
+ trigger) flush **before** the popover closes — including the common case of
271
+ opening a hoisted modal via `useDialogContainer` from a popover footer (the
272
+ modal mounts first, then the popover closes behind it). If your `onPress` is
273
+ async and `await`s before opening another overlay, the popover will close
274
+ first and the new overlay will appear after — usually fine, but worth noting.
275
+
198
276
  ## Best Practices
199
277
 
200
278
  1. **Do**: Provide a label for icon-only buttons