@cube-dev/ui-kit 0.138.6 → 0.140.0

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 (485) hide show
  1. package/dist/CHANGELOG.md +67 -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.d.ts +2 -2
  20. package/dist/components/actions/Button/Button.js +11 -17
  21. package/dist/components/actions/Button/Button.js.map +1 -1
  22. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.d.ts +2 -2
  28. package/dist/components/actions/ItemAction/ItemAction.js +8 -22
  29. package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
  30. package/dist/components/actions/ItemActionContext.js +2 -2
  31. package/dist/components/actions/ItemActionContext.js.map +1 -1
  32. package/dist/components/actions/ItemButton/ItemButton.js +3 -3
  33. package/dist/components/actions/ItemButton/ItemButton.js.map +1 -1
  34. package/dist/components/actions/Link/Link.js +1 -1
  35. package/dist/components/actions/Menu/Menu.js +1 -1
  36. package/dist/components/actions/Menu/MenuItem.js +1 -1
  37. package/dist/components/actions/Menu/MenuSection.js +1 -1
  38. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  39. package/dist/components/actions/Menu/SubMenuTrigger.js +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 +3 -3
  43. package/dist/components/actions/Menu/styled.js.map +1 -1
  44. package/dist/components/actions/index.js +1 -1
  45. package/dist/components/actions/use-action.js +1 -1
  46. package/dist/components/actions/use-anchored-menu.js +1 -1
  47. package/dist/components/actions/use-context-menu.js +1 -1
  48. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  49. package/dist/components/content/Alert/Alert.js +1 -1
  50. package/dist/components/content/Alert/use-alert.js +1 -1
  51. package/dist/components/content/Avatar/Avatar.js +1 -1
  52. package/dist/components/content/Badge/Badge.js +1 -1
  53. package/dist/components/content/Card/Card.js +1 -1
  54. package/dist/components/content/Content.js +1 -1
  55. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  56. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  57. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  58. package/dist/components/content/Divider.js +1 -1
  59. package/dist/components/content/Footer.js +1 -1
  60. package/dist/components/content/Header.js +1 -1
  61. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  62. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  63. package/dist/components/content/Item/Item.d.ts +3 -3
  64. package/dist/components/content/Item/Item.js +19 -25
  65. package/dist/components/content/Item/Item.js.map +1 -1
  66. package/dist/components/content/ItemBadge/ItemBadge.d.ts +2 -2
  67. package/dist/components/content/ItemBadge/ItemBadge.js +12 -18
  68. package/dist/components/content/ItemBadge/ItemBadge.js.map +1 -1
  69. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  70. package/dist/components/content/Layout/GridLayout.js +1 -1
  71. package/dist/components/content/Layout/Layout.js +1 -1
  72. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  73. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  74. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  75. package/dist/components/content/Layout/LayoutContent.js +1 -1
  76. package/dist/components/content/Layout/LayoutContext.js +1 -1
  77. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  78. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  79. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  80. package/dist/components/content/Layout/LayoutHeader.js +2 -2
  81. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  82. package/dist/components/content/Layout/LayoutPane.js +1 -1
  83. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  84. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  85. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  86. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  87. package/dist/components/content/Layout/index.js +1 -1
  88. package/dist/components/content/Layout/utils.js +1 -1
  89. package/dist/components/content/Paragraph.js +1 -1
  90. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  91. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  92. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  93. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  94. package/dist/components/content/Result/Result.js +1 -1
  95. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  96. package/dist/components/content/Tag/Tag.js +1 -1
  97. package/dist/components/content/Text.js +1 -1
  98. package/dist/components/content/TextItem/TextItem.js +1 -1
  99. package/dist/components/content/Title.js +1 -1
  100. package/dist/components/content/Tree/Tree.js +1 -1
  101. package/dist/components/content/Tree/TreeNode.js +1 -1
  102. package/dist/components/content/Tree/styled.js +1 -1
  103. package/dist/components/content/Tree/tree-index.js +1 -1
  104. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  105. package/dist/components/content/Tree/use-load-data.js +1 -1
  106. package/dist/components/content/highlightText.js +1 -1
  107. package/dist/components/content/use-auto-tooltip.js +1 -1
  108. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  109. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  110. package/dist/components/fields/Checkbox/context.js +1 -1
  111. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  112. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  113. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  114. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  115. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  116. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  117. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  118. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  119. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  120. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  121. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  122. package/dist/components/fields/DatePicker/intl.js +1 -1
  123. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  124. package/dist/components/fields/DatePicker/props.js +1 -1
  125. package/dist/components/fields/DatePicker/utils.js +1 -1
  126. package/dist/components/fields/FileInput/FileInput.js +1 -1
  127. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  128. package/dist/components/fields/FilterPicker/FilterPicker.d.ts +8 -0
  129. package/dist/components/fields/FilterPicker/FilterPicker.js +14 -10
  130. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  131. package/dist/components/fields/Input/Input.js +1 -1
  132. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  133. package/dist/components/fields/ListBox/ListBox.js +1 -1
  134. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  135. package/dist/components/fields/NumberInput/StepButton.js +3 -3
  136. package/dist/components/fields/NumberInput/StepButton.js.map +1 -1
  137. package/dist/components/fields/PasswordInput/PasswordInput.js +2 -2
  138. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  139. package/dist/components/fields/Picker/Picker.js +12 -8
  140. package/dist/components/fields/Picker/Picker.js.map +1 -1
  141. package/dist/components/fields/RadioGroup/Radio.d.ts +1 -1
  142. package/dist/components/fields/RadioGroup/Radio.js +40 -12
  143. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  144. package/dist/components/fields/RadioGroup/RadioGroup.d.ts +1 -1
  145. package/dist/components/fields/RadioGroup/RadioGroup.js +15 -5
  146. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  147. package/dist/components/fields/RadioGroup/context.js +1 -1
  148. package/dist/components/fields/SearchInput/SearchInput.js +2 -2
  149. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  150. package/dist/components/fields/Select/Select.d.ts +1 -1
  151. package/dist/components/fields/Select/Select.js +11 -7
  152. package/dist/components/fields/Select/Select.js.map +1 -1
  153. package/dist/components/fields/Slider/Gradation.js +1 -1
  154. package/dist/components/fields/Slider/HueSlider.js +1 -1
  155. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  156. package/dist/components/fields/Slider/Slider.js +1 -1
  157. package/dist/components/fields/Slider/SliderBase.js +1 -1
  158. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  159. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  160. package/dist/components/fields/Slider/elements.js +1 -1
  161. package/dist/components/fields/Slider/index.js +1 -1
  162. package/dist/components/fields/Switch/Switch.js +1 -1
  163. package/dist/components/fields/TextArea/TextArea.js +1 -1
  164. package/dist/components/fields/TextInput/TextInput.js +1 -1
  165. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  166. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  167. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  168. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  169. package/dist/components/form/Form/Field.js +1 -1
  170. package/dist/components/form/Form/Form.js +1 -1
  171. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  172. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  173. package/dist/components/form/Form/SubmitError.js +1 -1
  174. package/dist/components/form/Form/index.js +1 -1
  175. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  176. package/dist/components/form/Form/use-field/use-field.js +1 -1
  177. package/dist/components/form/Form/use-form.js +1 -1
  178. package/dist/components/form/Form/validation.js +1 -1
  179. package/dist/components/form/Label.js +1 -1
  180. package/dist/components/form/wrapper.js +1 -1
  181. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  182. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  183. package/dist/components/layout/Flex.js +1 -1
  184. package/dist/components/layout/Flow.js +1 -1
  185. package/dist/components/layout/Grid.js +1 -1
  186. package/dist/components/layout/Panel.js +1 -1
  187. package/dist/components/layout/Prefix.js +1 -1
  188. package/dist/components/layout/ResizablePanel.js +1 -1
  189. package/dist/components/layout/Space.js +1 -1
  190. package/dist/components/layout/Suffix.js +1 -1
  191. package/dist/components/navigation/Tabs/DraggableTabList.js +6 -4
  192. package/dist/components/navigation/Tabs/DraggableTabList.js.map +1 -1
  193. package/dist/components/navigation/Tabs/TabButton.js +12 -7
  194. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  195. package/dist/components/navigation/Tabs/TabDropIndicator.js +9 -4
  196. package/dist/components/navigation/Tabs/TabDropIndicator.js.map +1 -1
  197. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  198. package/dist/components/navigation/Tabs/TabPicker.js +11 -6
  199. package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
  200. package/dist/components/navigation/Tabs/Tabs.js +137 -104
  201. package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
  202. package/dist/components/navigation/Tabs/TabsAction.js +14 -6
  203. package/dist/components/navigation/Tabs/TabsAction.js.map +1 -1
  204. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  205. package/dist/components/navigation/Tabs/TabsContext.js.map +1 -1
  206. package/dist/components/navigation/Tabs/popover-placement.js +21 -0
  207. package/dist/components/navigation/Tabs/popover-placement.js.map +1 -0
  208. package/dist/components/navigation/Tabs/styled.js +201 -70
  209. package/dist/components/navigation/Tabs/styled.js.map +1 -1
  210. package/dist/components/navigation/Tabs/types.d.ts +16 -2
  211. package/dist/components/navigation/Tabs/types.js +1 -1
  212. package/dist/components/navigation/Tabs/types.js.map +1 -1
  213. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  214. package/dist/components/navigation/Tabs/use-tab-indicator.js +26 -14
  215. package/dist/components/navigation/Tabs/use-tab-indicator.js.map +1 -1
  216. package/dist/components/organisms/FileTabs/FileTabs.js +2 -2
  217. package/dist/components/organisms/FileTabs/FileTabs.js.map +1 -1
  218. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  219. package/dist/components/other/Calendar/Calendar.js +1 -1
  220. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  221. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  222. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  223. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  224. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  225. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  226. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  227. package/dist/components/overlays/Dialog/Dialog.js +2 -2
  228. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  229. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  230. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  231. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  232. package/dist/components/overlays/Dialog/context.js +1 -1
  233. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  234. package/dist/components/overlays/Modal/Modal.js +1 -1
  235. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  236. package/dist/components/overlays/Modal/Overlay.js +1 -1
  237. package/dist/components/overlays/Modal/Popover.js +1 -1
  238. package/dist/components/overlays/Modal/Tray.js +1 -1
  239. package/dist/components/overlays/Modal/Underlay.js +1 -1
  240. package/dist/components/overlays/Notifications/Notification.js +1 -1
  241. package/dist/components/overlays/Notifications/NotificationAction.d.ts +1 -1
  242. package/dist/components/overlays/Notifications/NotificationAction.js +4 -3
  243. package/dist/components/overlays/Notifications/NotificationAction.js.map +1 -1
  244. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  245. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  246. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  247. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  248. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  249. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  250. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  251. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  252. package/dist/components/overlays/Notifications/index.js +1 -1
  253. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  254. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  255. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  256. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  257. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  258. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  259. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  260. package/dist/components/overlays/Toast/index.js +1 -1
  261. package/dist/components/overlays/Toast/useProgressToast.js +3 -2
  262. package/dist/components/overlays/Toast/useProgressToast.js.map +1 -1
  263. package/dist/components/overlays/Toast/useToast.js +1 -1
  264. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  265. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  266. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  267. package/dist/components/overlays/Tooltip/context.js +1 -1
  268. package/dist/components/portal/Portal.js +1 -1
  269. package/dist/components/portal/PortalProvider.js +1 -1
  270. package/dist/components/portal/usePortal.js +1 -1
  271. package/dist/components/shared/DraggableCollection.js +9 -3
  272. package/dist/components/shared/DraggableCollection.js.map +1 -1
  273. package/dist/components/shared/InvalidIcon.js +1 -1
  274. package/dist/components/shared/ValidIcon.js +1 -1
  275. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  276. package/dist/components/status/Spin/Cube.js +1 -1
  277. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  278. package/dist/components/status/Spin/Spin.js +1 -1
  279. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  280. package/dist/data/item-themes.d.ts +1 -1
  281. package/dist/data/item-themes.js +377 -467
  282. package/dist/data/item-themes.js.map +1 -1
  283. package/dist/data/themes.js +1 -1
  284. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  285. package/dist/icons/AdjustmentsIcon.js +1 -1
  286. package/dist/icons/AiIcon.js +1 -1
  287. package/dist/icons/AreaChartIcon.js +1 -1
  288. package/dist/icons/BackwardIcon.js +1 -1
  289. package/dist/icons/BarChartIcon.js +1 -1
  290. package/dist/icons/BellFilledIcon.js +1 -1
  291. package/dist/icons/BellIcon.js +1 -1
  292. package/dist/icons/BooleanIcon.js +1 -1
  293. package/dist/icons/CalendarEditIcon.js +1 -1
  294. package/dist/icons/CalendarIcon.js +1 -1
  295. package/dist/icons/CaretDownIcon.js +1 -1
  296. package/dist/icons/CaretUpIcon.js +1 -1
  297. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  298. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  299. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  300. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  301. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  302. package/dist/icons/ChartBarLineIcon.js +1 -1
  303. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  304. package/dist/icons/ChartBarStackedIcon.js +1 -1
  305. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  306. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  307. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  308. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  309. package/dist/icons/ChartBubbleIcon.js +1 -1
  310. package/dist/icons/ChartDonut2Icon.js +1 -1
  311. package/dist/icons/ChartFunnelIcon.js +1 -1
  312. package/dist/icons/ChartHeatmapIcon.js +1 -1
  313. package/dist/icons/ChartKPIIcon.js +1 -1
  314. package/dist/icons/ChartPie2Icon.js +1 -1
  315. package/dist/icons/ChartScatterIcon.js +1 -1
  316. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  317. package/dist/icons/CheckCircleIcon.js +1 -1
  318. package/dist/icons/CheckIcon.js +1 -1
  319. package/dist/icons/CircleFilledIcon.js +1 -1
  320. package/dist/icons/ClearIcon.js +1 -1
  321. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  322. package/dist/icons/CloseCircleIcon.js +1 -1
  323. package/dist/icons/CloseIcon.js +1 -1
  324. package/dist/icons/CodeIcon.js +1 -1
  325. package/dist/icons/ColumnTotalIcon.js +1 -1
  326. package/dist/icons/CopyIcon.js +1 -1
  327. package/dist/icons/CountIcon.js +1 -1
  328. package/dist/icons/CubeIcon.js +1 -1
  329. package/dist/icons/CubePauseIcon.js +1 -1
  330. package/dist/icons/CubePlayIcon.js +1 -1
  331. package/dist/icons/CurrencyDollarIcon.js +1 -1
  332. package/dist/icons/DangerIcon.js +1 -1
  333. package/dist/icons/DashboardIcon.js +1 -1
  334. package/dist/icons/DatabaseIcon.js +1 -1
  335. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  336. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  337. package/dist/icons/DirectionIcon.js +1 -1
  338. package/dist/icons/DonutIcon.js +1 -1
  339. package/dist/icons/DownIcon.js +1 -1
  340. package/dist/icons/EditIcon.js +1 -1
  341. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  342. package/dist/icons/ExclamationCircleIcon.js +1 -1
  343. package/dist/icons/ExclamationIcon.js +1 -1
  344. package/dist/icons/EyeIcon.js +1 -1
  345. package/dist/icons/EyeInvisibleIcon.js +1 -1
  346. package/dist/icons/FilterIcon.js +1 -1
  347. package/dist/icons/FolderFilledIcon.js +1 -1
  348. package/dist/icons/FolderIcon.js +1 -1
  349. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  350. package/dist/icons/FolderOpenIcon.js +1 -1
  351. package/dist/icons/ForwardIcon.js +1 -1
  352. package/dist/icons/GripVerticalIcon.js +1 -1
  353. package/dist/icons/HierarchyIcon.js +1 -1
  354. package/dist/icons/HierarchyOpenIcon.js +1 -1
  355. package/dist/icons/Icon.js +1 -1
  356. package/dist/icons/InfoCircleIcon.js +1 -1
  357. package/dist/icons/InfoIcon.js +1 -1
  358. package/dist/icons/KeyIcon.js +1 -1
  359. package/dist/icons/LeftIcon.js +1 -1
  360. package/dist/icons/LineChartIcon.js +1 -1
  361. package/dist/icons/LoadingIcon.js +1 -1
  362. package/dist/icons/LockFilledIcon.js +1 -1
  363. package/dist/icons/LockIcon.js +1 -1
  364. package/dist/icons/MoreIcon.js +1 -1
  365. package/dist/icons/NotAllowedIcon.js +1 -1
  366. package/dist/icons/Number123Icon.js +1 -1
  367. package/dist/icons/NumberIcon.js +1 -1
  368. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  369. package/dist/icons/PauseCircleIcon.js +1 -1
  370. package/dist/icons/PauseIcon.js +1 -1
  371. package/dist/icons/PercentageIcon.js +1 -1
  372. package/dist/icons/PieChartIcon.js +1 -1
  373. package/dist/icons/PlayCircleIcon.js +1 -1
  374. package/dist/icons/PlayIcon.js +1 -1
  375. package/dist/icons/PlusIcon.js +1 -1
  376. package/dist/icons/ProgressBarIcon.js +1 -1
  377. package/dist/icons/ReloadIcon.js +1 -1
  378. package/dist/icons/ReportIcon.js +1 -1
  379. package/dist/icons/ReturnIcon.js +1 -1
  380. package/dist/icons/RightIcon.js +1 -1
  381. package/dist/icons/RowTotalsIcon.js +1 -1
  382. package/dist/icons/SchemeIcon.js +1 -1
  383. package/dist/icons/SearchIcon.js +1 -1
  384. package/dist/icons/SemanticQueryIcon.js +1 -1
  385. package/dist/icons/SettingsIcon.js +1 -1
  386. package/dist/icons/ShieldFilledIcon.js +1 -1
  387. package/dist/icons/ShieldIcon.js +1 -1
  388. package/dist/icons/SlashIcon.js +1 -1
  389. package/dist/icons/SparklesIcon.js +1 -1
  390. package/dist/icons/SqlIcon.js +1 -1
  391. package/dist/icons/StatsIcon.js +1 -1
  392. package/dist/icons/StopIcon.js +1 -1
  393. package/dist/icons/StringIcon.js +1 -1
  394. package/dist/icons/SubtotalsIcon.js +1 -1
  395. package/dist/icons/SwitchIcon.js +1 -1
  396. package/dist/icons/TableIcon.js +1 -1
  397. package/dist/icons/ThumbsDownIcon.js +1 -1
  398. package/dist/icons/ThumbsUpIcon.js +1 -1
  399. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  400. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  401. package/dist/icons/ThunderboltIcon.js +1 -1
  402. package/dist/icons/TimeIcon.js +1 -1
  403. package/dist/icons/TrashIcon.js +1 -1
  404. package/dist/icons/UnlockIcon.js +1 -1
  405. package/dist/icons/UpIcon.js +1 -1
  406. package/dist/icons/UserGroupIcon.js +1 -1
  407. package/dist/icons/UserIcon.js +1 -1
  408. package/dist/icons/UserLockIcon.js +1 -1
  409. package/dist/icons/ViewIcon.js +1 -1
  410. package/dist/icons/WarningFilledIcon.js +1 -1
  411. package/dist/icons/WarningIcon.js +1 -1
  412. package/dist/icons/wrap-icon.js +1 -1
  413. package/dist/index.js +1 -1
  414. package/dist/provider.js +1 -1
  415. package/dist/providers/TrackingProvider.js +1 -1
  416. package/dist/providers/navigationAdapter.default.js +1 -1
  417. package/dist/tokens/base.js +1 -1
  418. package/dist/tokens/colors.js +1 -1
  419. package/dist/tokens/index.js +1 -1
  420. package/dist/tokens/layout.js +1 -1
  421. package/dist/tokens/palette.js +52 -22
  422. package/dist/tokens/palette.js.map +1 -1
  423. package/dist/tokens/shadows.js +1 -1
  424. package/dist/tokens/sizes.js +1 -1
  425. package/dist/tokens/spacing.js +1 -1
  426. package/dist/tokens/typography.js +1 -1
  427. package/dist/utils/ResizeSensor.js +1 -1
  428. package/dist/utils/is-dev-env.js +1 -1
  429. package/dist/utils/modules.js +1 -1
  430. package/dist/utils/promise.js +1 -1
  431. package/dist/utils/raf.js +1 -1
  432. package/dist/utils/random.js +1 -1
  433. package/dist/utils/range.js +1 -1
  434. package/dist/utils/react/RenderCache.js +1 -1
  435. package/dist/utils/react/Slots.js +1 -1
  436. package/dist/utils/react/chain.js +1 -1
  437. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  438. package/dist/utils/react/index.js +1 -1
  439. package/dist/utils/react/interactions.js +1 -1
  440. package/dist/utils/react/isTextOnly.js +1 -1
  441. package/dist/utils/react/mapProps.js +1 -1
  442. package/dist/utils/react/mergeProps.js +1 -1
  443. package/dist/utils/react/nullableValue.js +1 -1
  444. package/dist/utils/react/resolveIcon.js +1 -1
  445. package/dist/utils/react/sharedStore.js +1 -1
  446. package/dist/utils/react/useCombinedRefs.js +1 -1
  447. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  448. package/dist/utils/react/useEventBus.js +1 -1
  449. package/dist/utils/react/useId.js +1 -1
  450. package/dist/utils/react/useIsDarwin.js +1 -1
  451. package/dist/utils/react/useKeySymbols.js +1 -1
  452. package/dist/utils/react/useLayoutEffect.js +1 -1
  453. package/dist/utils/react/useLocalStorage.js +1 -1
  454. package/dist/utils/react/useMergeStyles.js +1 -1
  455. package/dist/utils/react/usePopoverSync.js +1 -1
  456. package/dist/utils/react/useQaProps.js +1 -1
  457. package/dist/utils/react/useViewportSize.js +1 -1
  458. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  459. package/dist/utils/selection.js +1 -1
  460. package/dist/utils/styles.js +1 -1
  461. package/dist/utils/tree.js +1 -1
  462. package/dist/utils/warnings.js +1 -1
  463. package/dist/version.js +2 -2
  464. package/docs/ComplexLayout.md +2 -2
  465. package/docs/components/CollectionItem.md +1 -1
  466. package/docs/components/actions/Banner.md +1 -1
  467. package/docs/components/actions/Button.md +3 -5
  468. package/docs/components/actions/ButtonGroup.md +1 -1
  469. package/docs/components/actions/ButtonSplit.md +1 -2
  470. package/docs/components/actions/ItemAction.md +5 -5
  471. package/docs/components/actions/ItemButton.md +4 -6
  472. package/docs/components/content/Item.md +9 -10
  473. package/docs/components/content/ItemBadge.md +4 -4
  474. package/docs/components/content/ItemCard.md +1 -1
  475. package/docs/components/content/Layout.md +2 -2
  476. package/docs/components/content/Tag.md +1 -1
  477. package/docs/components/fields/FilterListBox.md +1 -1
  478. package/docs/components/fields/FilterPicker.md +3 -5
  479. package/docs/components/fields/ListBox.md +1 -1
  480. package/docs/components/fields/Picker.md +3 -5
  481. package/docs/components/fields/RadioGroup.md +7 -9
  482. package/docs/components/fields/Select.md +2 -4
  483. package/docs/components/navigation/Tabs.md +33 -8
  484. package/docs/components/organisms/FileTabs.md +2 -2
  485. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { FormContext } from "./Form.js";
3
3
  import { Alert } from "../../content/Alert/Alert.js";
4
4
  import { forwardRef, isValidElement, useContext } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { useForm } from "./use-form.js";
3
3
  import { FormContext, _Form, useFormProps } from "./Form.js";
4
4
  import { useField } from "./use-field/use-field.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { mergeProps } from "../../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../../_internal/hooks/use-event.js";
4
4
  import { warn } from "../../../../utils/warnings.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../../_internal/hooks/use-event.js";
3
3
  import { useIsFirstRender } from "../../../../_internal/hooks/use-is-first-render.js";
4
4
  import { delayValidationRule } from "../validation.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { applyRules } from "./validation.js";
3
3
  import { dotize } from "@tenphi/tasty";
4
4
  import { useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { validate } from "email-validator";
3
3
  import validUrl from "valid-url";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useProviderProps } from "../../provider.js";
4
4
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { mergeProps } from "../../utils/react/mergeProps.js";
3
3
  import { FieldWrapper } from "./FieldWrapper/FieldWrapper.js";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { useCallback, useLayoutEffect, useRef, useState } from "react";
3
3
 
4
4
  //#region src/components/helpers/DisplayTransition/DisplayTransition.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { DisplayTransition } from "../DisplayTransition/DisplayTransition.js";
3
3
  import { tasty } from "@tenphi/tasty";
4
4
  import { isValidElement, useCallback, useLayoutEffect, useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | 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.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | 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.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | 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.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { BASE_STYLES, BLOCK_STYLES, COLOR_STYLES, DIMENSION_STYLES, OUTER_STYLES, tasty } from "@tenphi/tasty";
3
3
  import { forwardRef, useMemo } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useLayoutEffect as useLayoutEffect$1 } from "../../utils/react/useLayoutEffect.js";
4
4
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../utils/react/mergeProps.js";
3
3
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../_internal/hooks/use-event.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | 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.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
4
4
  import { CONTAINER_STYLES, filterBaseProps, parseStyle, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { DraggableCollection } from "../../shared/DraggableCollection.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
 
@@ -6,14 +6,16 @@ import { jsx } from "react/jsx-runtime";
6
6
  /**
7
7
  * Component that enables drag-and-drop reordering for tabs.
8
8
  *
9
- * Thin wrapper around DraggableCollection with horizontal orientation.
9
+ * Thin wrapper around DraggableCollection. The `orientation` prop should be
10
+ * derived from the parent Tabs `placement` so drag math/visuals match the
11
+ * visible axis (horizontal for `top`/`bottom`, vertical for `left`/`right`).
10
12
  */
11
- function DraggableTabList({ state, listRef, orderedKeys, onReorder, children }) {
13
+ function DraggableTabList({ state, listRef, orderedKeys, orientation = "horizontal", onReorder, children }) {
12
14
  return /* @__PURE__ */ jsx(DraggableCollection, {
13
15
  state,
14
16
  listRef,
15
17
  orderedKeys,
16
- orientation: "horizontal",
18
+ orientation,
17
19
  onReorder,
18
20
  children
19
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableTabList.js","names":[],"sources":["../../../../src/components/navigation/Tabs/DraggableTabList.tsx"],"sourcesContent":["import { ReactNode, RefObject } from 'react';\nimport {\n DraggableCollectionState,\n DroppableCollectionState,\n TabListState,\n} from 'react-stately';\n\nimport { DraggableCollection } from '../../shared/DraggableCollection';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DraggableTabListProps {\n /** Tab list state from React Stately */\n state: TabListState<object>;\n /** Ref to the tab list container */\n listRef: RefObject<HTMLDivElement | null>;\n /** Current ordered keys */\n orderedKeys: string[];\n /** Callback when tabs are reordered */\n onReorder?: (newOrder: string[]) => void;\n /** Render function that receives drag/drop states */\n children: (\n dragState: DraggableCollectionState,\n dropState: DroppableCollectionState,\n collectionProps: Record<string, unknown>,\n ) => ReactNode;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Component that enables drag-and-drop reordering for tabs.\n *\n * Thin wrapper around DraggableCollection with horizontal orientation.\n */\nexport function DraggableTabList({\n state,\n listRef,\n orderedKeys,\n onReorder,\n children,\n}: DraggableTabListProps) {\n return (\n <DraggableCollection\n state={state}\n listRef={listRef}\n orderedKeys={orderedKeys}\n orientation=\"horizontal\"\n onReorder={onReorder}\n >\n {children}\n </DraggableCollection>\n );\n}\n"],"mappings":";;;;;;;;;;AAuCA,SAAgB,iBAAiB,EAC/B,OACA,SACA,aACA,WACA,YACwB;AACxB,QACE,oBAAC;EACQ;EACE;EACI;EACb,aAAY;EACD;EAEV;GACmB"}
1
+ {"version":3,"file":"DraggableTabList.js","names":[],"sources":["../../../../src/components/navigation/Tabs/DraggableTabList.tsx"],"sourcesContent":["import { ReactNode, RefObject } from 'react';\nimport {\n DraggableCollectionState,\n DroppableCollectionState,\n TabListState,\n} from 'react-stately';\n\nimport { DraggableCollection } from '../../shared/DraggableCollection';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface DraggableTabListProps {\n /** Tab list state from React Stately */\n state: TabListState<object>;\n /** Ref to the tab list container */\n listRef: RefObject<HTMLDivElement | null>;\n /** Current ordered keys */\n orderedKeys: string[];\n /**\n * Orientation of the underlying DraggableCollection.\n * Driven by the parent Tabs `placement`.\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /** Callback when tabs are reordered */\n onReorder?: (newOrder: string[]) => void;\n /** Render function that receives drag/drop states */\n children: (\n dragState: DraggableCollectionState,\n dropState: DroppableCollectionState,\n collectionProps: Record<string, unknown>,\n ) => ReactNode;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Component that enables drag-and-drop reordering for tabs.\n *\n * Thin wrapper around DraggableCollection. The `orientation` prop should be\n * derived from the parent Tabs `placement` so drag math/visuals match the\n * visible axis (horizontal for `top`/`bottom`, vertical for `left`/`right`).\n */\nexport function DraggableTabList({\n state,\n listRef,\n orderedKeys,\n orientation = 'horizontal',\n onReorder,\n children,\n}: DraggableTabListProps) {\n return (\n <DraggableCollection\n state={state}\n listRef={listRef}\n orderedKeys={orderedKeys}\n orientation={orientation}\n onReorder={onReorder}\n >\n {children}\n </DraggableCollection>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA+CA,SAAgB,iBAAiB,EAC/B,OACA,SACA,aACA,cAAc,cACd,WACA,YACwB;AACxB,QACE,oBAAC;EACQ;EACE;EACI;EACA;EACF;EAEV;GACmB"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | 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 { ItemActionProvider } from "../../actions/ItemActionContext.js";
@@ -11,8 +11,9 @@ import { __Menu } from "../../actions/Menu/Menu.js";
11
11
  import { useContextMenu } from "../../actions/use-context-menu.js";
12
12
  import { createMockDragState } from "../../shared/DraggableCollection.js";
13
13
  import { TabContainer, TabElement } from "./styled.js";
14
- import { TabDropIndicator } from "./TabDropIndicator.js";
14
+ import { POPOVER_PLACEMENT_BY_TABS_PLACEMENT } from "./popover-placement.js";
15
15
  import { useTabsContext } from "./TabsContext.js";
16
+ import { TabDropIndicator } from "./TabDropIndicator.js";
16
17
  import { RADIO_SIZE_MAP } from "./types.js";
17
18
  import { Children, cloneElement, isValidElement, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
18
19
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -94,7 +95,7 @@ function isMenuEmpty(menu) {
94
95
  * - Focus and hover states
95
96
  */
96
97
  function TabButton({ item, tabData, isLastTab }) {
97
- const { state, type, size, autoHideActions: parentAutoHideActions, isEditable: parentIsEditable, menu: parentMenu, menuTriggerProps: parentMenuTriggerProps, menuProps: parentMenuProps, contextMenu: parentContextMenu, onAction: parentOnAction, onDelete, dragState, dropState, editingKey, startEditing, submitEditing, cancelEditing } = useTabsContext();
98
+ const { state, type, size, placement, autoHideActions: parentAutoHideActions, isEditable: parentIsEditable, menu: parentMenu, menuTriggerProps: parentMenuTriggerProps, menuProps: parentMenuProps, contextMenu: parentContextMenu, onAction: parentOnAction, onDelete, dragState, dropState, editingKey, startEditing, submitEditing, cancelEditing } = useTabsContext();
98
99
  const ref = useRef(null);
99
100
  const containerRef = useRef(null);
100
101
  const actionsRef = useRef(null);
@@ -128,7 +129,7 @@ function TabButton({ item, tabData, isLastTab }) {
128
129
  ...tabData.menuProps
129
130
  };
130
131
  const effectiveContextMenu = tabData.contextMenu ?? parentContextMenu ?? false;
131
- const effectiveType = tabData.type ?? type ?? "default";
132
+ const effectiveType = type ?? "default";
132
133
  const contextMenuEnabled = effectiveContextMenu === true || effectiveContextMenu === "context-only";
133
134
  const contextMenuOnly = effectiveContextMenu === "context-only";
134
135
  const showDeleteButton = isDeletable && (isMenuEmpty(effectiveMenu) || contextMenuOnly);
@@ -195,7 +196,8 @@ function TabButton({ item, tabData, isLastTab }) {
195
196
  onAction: handleMenuAction,
196
197
  children: processedMenu
197
198
  }) : null;
198
- const contextMenu = useContextMenu(__Menu, { placement: "bottom start" }, {
199
+ const menuPopoverPlacement = POPOVER_PLACEMENT_BY_TABS_PLACEMENT[placement];
200
+ const contextMenu = useContextMenu(__Menu, { placement: menuPopoverPlacement }, {
199
201
  ...effectiveMenuProps,
200
202
  onAction: handleMenuAction,
201
203
  children: processedMenu
@@ -220,6 +222,7 @@ function TabButton({ item, tabData, isLastTab }) {
220
222
  });
221
223
  const mods = useMemo(() => ({
222
224
  type: effectiveType,
225
+ placement,
223
226
  active: isActive,
224
227
  deletable: isDeletable,
225
228
  disabled: isDisabled,
@@ -231,6 +234,7 @@ function TabButton({ item, tabData, isLastTab }) {
231
234
  dragging: isDragging
232
235
  }), [
233
236
  effectiveType,
237
+ placement,
234
238
  isActive,
235
239
  isDeletable,
236
240
  isDisabled,
@@ -249,6 +253,7 @@ function TabButton({ item, tabData, isLastTab }) {
249
253
  }, [isActive]);
250
254
  const menuAction = menuElement && !contextMenuOnly ? /* @__PURE__ */ jsxs(_MenuTrigger, {
251
255
  isOpen: isMenuOpen,
256
+ placement: menuPopoverPlacement,
252
257
  onOpenChange: setIsMenuOpen,
253
258
  children: [/* @__PURE__ */ jsx(ItemAction, {
254
259
  tabIndex: -1,
@@ -272,10 +277,10 @@ function TabButton({ item, tabData, isLastTab }) {
272
277
  }, [actions]);
273
278
  const effectiveSize = tabData.size ?? size ?? "medium";
274
279
  const itemSize = effectiveType === "radio" ? RADIO_SIZE_MAP[effectiveSize === "large" ? "large" : "medium"] : effectiveSize;
275
- const itemType = effectiveType === "default" ? isActive ? "clear" : "neutral" : "neutral";
280
+ const itemType = "clear";
276
281
  const itemShape = effectiveType === "file" ? "sharp" : void 0;
277
282
  const effectiveAutoHideActions = tabData.autoHideActions ?? parentAutoHideActions;
278
- const { title: _title, content: _content, key: _key, isDisabled: _isDisabled, prerender: _prerender, keepMounted: _keepMounted, size: _size, type: _type, actions: _actions, autoHideActions: _autoHideActions, isEditable: _isEditable, onTitleChange: _onTitleChange, menu: _menu, menuTriggerProps: _menuTriggerProps, menuProps: _menuProps, contextMenu: _contextMenu, onAction: _onAction, tooltip: tabTooltip, qa, qaVal, styles, ...itemStyleProps } = tabData;
283
+ const { title: _title, content: _content, key: _key, isDisabled: _isDisabled, prerender: _prerender, keepMounted: _keepMounted, size: _size, actions: _actions, autoHideActions: _autoHideActions, isEditable: _isEditable, onTitleChange: _onTitleChange, menu: _menu, menuTriggerProps: _menuTriggerProps, menuProps: _menuProps, contextMenu: _contextMenu, onAction: _onAction, tooltip: tabTooltip, qa, qaVal, styles, ...itemStyleProps } = tabData;
279
284
  const renderTitleDisplay = typeof tabData.title === "string" ? void 0 : () => tabData.title;
280
285
  const titleContent = effectiveIsEditable ? /* @__PURE__ */ jsx(InlineInput, {
281
286
  ref: inlineInputRef,
@@ -1 +1 @@
1
- {"version":3,"file":"TabButton.js","names":["Menu","MenuTrigger","mergeProps"],"sources":["../../../../src/components/navigation/Tabs/TabButton.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n useDraggableItem,\n useFocus,\n useFocusVisible,\n useHover,\n useTab,\n} from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { CloseIcon, MoreIcon } from '../../../icons';\nimport { mergeProps } from '../../../utils/react';\nimport { CubeItemActionProps, ItemAction } from '../../actions/ItemAction';\nimport { ItemActionProvider } from '../../actions/ItemActionContext';\nimport { CubeMenuProps, Menu, MenuTrigger } from '../../actions/Menu';\nimport { useContextMenu } from '../../actions/use-context-menu';\nimport {\n CubeInlineInputRef,\n InlineInput,\n} from '../../content/InlineInput/InlineInput';\nimport { createMockDragState } from '../../shared/DraggableCollection';\n\nimport { TabContainer, TabElement } from './styled';\nimport { TabDropIndicator } from './TabDropIndicator';\nimport { useTabsContext } from './TabsContext';\nimport { ParsedTab, RADIO_SIZE_MAP } from './types';\n\nimport type { Key, Node } from '@react-types/shared';\nimport type { KeyboardEvent, MouseEvent, PointerEvent } from 'react';\nimport type { DraggableCollectionState } from 'react-stately';\n\n// =============================================================================\n// Event handlers for actions to prevent event propagation to tab button\n// =============================================================================\n\nconst ACTIONS_EVENT_HANDLERS = {\n onClick: (e: MouseEvent) => e.stopPropagation(),\n onPointerDown: (e: PointerEvent) => e.stopPropagation(),\n onPointerUp: (e: PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: MouseEvent) => e.stopPropagation(),\n onMouseUp: (e: MouseEvent) => e.stopPropagation(),\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n }\n },\n};\n\n// Inherit the tab button's pointer cursor — InlineInput's default `cursor: text`\n// hover hint is misleading inside a clickable tab.\nconst INLINE_INPUT_STYLES = { cursor: 'inherit' } as const;\n\n// =============================================================================\n// Menu Processing Utilities\n// =============================================================================\n\ninterface MenuItemLikeProps {\n children?: ReactNode;\n isDisabled?: boolean;\n theme?: string;\n}\n\n/**\n * Extracts the raw key from a React element, stripping the \".$\" prefix\n * that React adds via Children.map/toArray.\n */\nfunction getRawKey(element: ReactElement): string | null {\n if (element.key == null) return null;\n const keyStr = String(element.key);\n return keyStr.startsWith('.$') ? keyStr.slice(2) : keyStr;\n}\n\n/**\n * Process menu items for predefined action keys (rename, delete).\n * Auto-adds labels and disables items when requirements aren't met.\n */\nfunction processMenuItems(\n children: ReactNode,\n effectiveIsEditable: boolean,\n isDeletable: boolean,\n): ReactNode {\n // Use Children.forEach instead of Children.toArray to avoid React prepending\n // \".$\" to element keys, which breaks selectedKeys matching in Menu.\n const result: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n result.push(child);\n return;\n }\n\n const childKey = getRawKey(child);\n const childProps = child.props as MenuItemLikeProps;\n\n // Handle predefined action keys\n if (childKey === 'rename') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: childProps.children ?? 'Rename',\n isDisabled: childProps.isDisabled ?? !effectiveIsEditable,\n }),\n );\n return;\n }\n if (childKey === 'delete') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: childProps.children ?? 'Delete',\n theme: childProps.theme ?? 'danger',\n isDisabled: childProps.isDisabled ?? !isDeletable,\n }),\n );\n return;\n }\n\n // Recursively process Menu.Section children\n if (childProps.children && typeof childProps.children !== 'string') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: processMenuItems(\n childProps.children,\n effectiveIsEditable,\n isDeletable,\n ),\n }),\n );\n return;\n }\n\n result.push(child);\n });\n\n return result;\n}\n\n/**\n * Check if menu children is empty (null, undefined, or empty fragment)\n */\nfunction isMenuEmpty(menu: ReactNode): boolean {\n if (menu === null || menu === undefined) return true;\n const children = Children.toArray(menu);\n return children.length === 0;\n}\n\n// =============================================================================\n// TabButton Props\n// =============================================================================\n\nexport interface TabButtonProps {\n /** React Aria collection item */\n item: Node<object>;\n /** Parsed tab data */\n tabData: ParsedTab;\n /** Whether this is the last tab (for drop indicator) */\n isLastTab?: boolean;\n}\n\n// =============================================================================\n// TabButton Component\n// =============================================================================\n\n/**\n * Individual tab button component.\n *\n * Uses TabsContext to access shared props, dramatically reducing prop drilling.\n * Handles:\n * - Tab selection and keyboard navigation\n * - Inline title editing\n * - Menu and context menu\n * - Drag-and-drop reordering\n * - Focus and hover states\n */\nexport function TabButton({ item, tabData, isLastTab }: TabButtonProps) {\n // Get shared context\n const {\n state,\n type,\n size,\n autoHideActions: parentAutoHideActions,\n isEditable: parentIsEditable,\n menu: parentMenu,\n menuTriggerProps: parentMenuTriggerProps,\n menuProps: parentMenuProps,\n contextMenu: parentContextMenu,\n onAction: parentOnAction,\n onDelete,\n dragState,\n dropState,\n editingKey,\n startEditing,\n submitEditing,\n cancelEditing,\n } = useTabsContext();\n\n const ref = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const actionsRef = useRef<HTMLDivElement>(null);\n const inlineInputRef = useRef<CubeInlineInputRef>(null);\n const { tabProps } = useTab({ key: item.key }, state, ref);\n\n // Measure actions width for proper space allocation in Item\n const [actionsWidth, setActionsWidth] = useState(0);\n\n // Drag-and-drop support - only enable when both states are provided\n const isDraggable = !!dragState && !!dropState;\n\n // useDraggableItem must be called unconditionally (Rules of Hooks)\n // When dragState is undefined, we pass a minimal mock state to satisfy the hook\n const mockDragState = useMemo(\n () => createMockDragState(state.collection, state.selectionManager),\n [state.collection, state.selectionManager],\n );\n\n const dragResult = useDraggableItem(\n { key: item.key },\n dragState ?? mockDragState,\n );\n const effectiveDragProps = isDraggable ? dragResult.dragProps : {};\n const isDragging = isDraggable && dragResult.isDragging;\n\n // Controlled state for menu trigger (enables keyboard opening with Shift+F10)\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n // Hover, focus, and focus-visible state handling\n const { hoverProps, isHovered } = useHover({});\n const [isFocused, setIsFocused] = useState(false);\n const { focusProps } = useFocus({ onFocusChange: setIsFocused });\n const { isFocusVisible } = useFocusVisible();\n\n // Suppress focus-visible when restoring focus after editing\n const [suppressFocusVisible, setSuppressFocusVisible] = useState(false);\n const effectiveFocusVisible = isFocusVisible && !suppressFocusVisible;\n\n const isActive = state.selectedKey === item.key;\n const isDisabled = state.disabledKeys.has(item.key);\n const isDeletable = !!onDelete;\n const isEditing = editingKey === item.key;\n\n // Compute effective values - Tab-level overrides Tabs-level\n const effectiveIsEditable = tabData.isEditable ?? parentIsEditable ?? false;\n const effectiveMenu =\n tabData.menu === null ? null : tabData.menu ?? parentMenu;\n const effectiveMenuTriggerProps: Partial<CubeItemActionProps> = {\n ...parentMenuTriggerProps,\n ...tabData.menuTriggerProps,\n };\n const effectiveMenuProps: Partial<CubeMenuProps<object>> = {\n ...parentMenuProps,\n ...tabData.menuProps,\n };\n const effectiveContextMenu =\n tabData.contextMenu ?? parentContextMenu ?? false;\n const effectiveType = tabData.type ?? type ?? 'default';\n\n const contextMenuEnabled =\n effectiveContextMenu === true || effectiveContextMenu === 'context-only';\n const contextMenuOnly = effectiveContextMenu === 'context-only';\n\n // Inline close when no menu, or context-only (no overflow trigger)\n const showDeleteButton =\n isDeletable && (isMenuEmpty(effectiveMenu) || contextMenuOnly);\n\n // Process menu items for auto-labels and disabled states\n const processedMenu =\n effectiveMenu && !isMenuEmpty(effectiveMenu)\n ? processMenuItems(effectiveMenu, effectiveIsEditable, isDeletable)\n : null;\n\n const itemKeyStr = String(item.key);\n\n const handleDelete = useEvent(() => {\n onDelete?.(itemKeyStr);\n });\n\n const titleString =\n typeof tabData.title === 'string' ? tabData.title : itemKeyStr;\n\n const handleStartEditing = useEvent(() => {\n if (!effectiveIsEditable || isDisabled) return;\n startEditing(itemKeyStr, titleString);\n });\n\n const handleSubmitEditing = useEvent((newTitle: string) => {\n submitEditing(itemKeyStr, newTitle, tabData.onTitleChange);\n // Suppress focus-visible and restore focus to the tab button after editing\n setSuppressFocusVisible(true);\n ref.current?.focus();\n });\n\n const handleCancelEditing = useEvent(() => {\n cancelEditing();\n // Suppress focus-visible and restore focus to the tab button after editing\n setSuppressFocusVisible(true);\n ref.current?.focus();\n });\n\n const handleEditingChange = useEvent((editing: boolean) => {\n if (editing && !isEditing) {\n handleStartEditing();\n }\n });\n\n // Secondary defense against the Menu/InlineInput focus-theft race when a\n // consumer triggers rename from a menu item. `InlineInput` itself runs a\n // blur-side grace period after a programmatic `startEditing()` call (see\n // `PROGRAMMATIC_EDIT_BLUR_GRACE_MS`); this pass just re-focuses the input\n // across the Menu popover's exit transition (~350ms) in case another code\n // path (focus manager, host re-render) stole focus from it.\n //\n // The `seenEditingInput` guard ensures we don't reopen rename after the\n // user has already finished editing (Enter / Escape / blur-to-elsewhere):\n // once we've observed the editing input in the DOM and it later\n // disappears, the user committed/cancelled and we stop retrying.\n const renameInputSelector = 'input[aria-label=\"Edit tab title\"]';\n const scheduleRenameRefocus = useEvent(() => {\n let seenEditingInput = false;\n let cancelled = false;\n const timers: number[] = [];\n\n // Query the editing input via the tab button `ref` — that's always\n // wired up regardless of context-menu mode. `containerRef` is shadowed\n // by `contextMenu.targetRef` when context menu is enabled, and\n // `actionsRef` may never attach (e.g. `contextMenu=\"context-only\"` with\n // no delete button and no custom actions).\n const findEditingInput = (): HTMLInputElement | null =>\n (ref.current?.querySelector(renameInputSelector) ??\n null) as HTMLInputElement | null;\n\n const tick = () => {\n if (cancelled) return;\n\n const editingInput = findEditingInput();\n if (editingInput) {\n seenEditingInput = true;\n if (document.activeElement !== editingInput) {\n inlineInputRef.current?.focus();\n }\n\n return;\n }\n\n if (seenEditingInput) {\n cancelled = true;\n for (const t of timers) clearTimeout(t);\n }\n };\n\n requestAnimationFrame(tick);\n timers.push(window.setTimeout(tick, 50));\n timers.push(window.setTimeout(tick, 200));\n timers.push(window.setTimeout(tick, 400));\n });\n\n // Handle menu actions - predefined actions first, then callbacks\n const handleMenuAction = useEvent((action: Key) => {\n // Strip the \".$\" prefix that React adds via Children.toArray/map\n const actionStr = String(action);\n const normalizedAction = actionStr.startsWith('.$')\n ? actionStr.slice(2)\n : actionStr;\n\n // Handle predefined actions first (only if requirements are met)\n if (normalizedAction === 'rename' && effectiveIsEditable) {\n inlineInputRef.current?.startEditing();\n // Belt-and-suspenders: see `scheduleRenameRefocus` for the rationale.\n scheduleRenameRefocus();\n }\n if (normalizedAction === 'delete' && isDeletable) {\n onDelete?.(itemKeyStr);\n }\n // Call Tab-level onAction first (with normalized action)\n tabData.onAction?.(normalizedAction);\n // Then call Tabs-level onAction with tab key (with normalized action)\n parentOnAction?.(normalizedAction, itemKeyStr);\n });\n\n const menuElement = processedMenu ? (\n <Menu {...effectiveMenuProps} onAction={handleMenuAction}>\n {processedMenu}\n </Menu>\n ) : null;\n\n const contextMenu = useContextMenu<HTMLDivElement, CubeMenuProps<object>>(\n Menu,\n { placement: 'bottom start' },\n {\n ...effectiveMenuProps,\n onAction: handleMenuAction,\n children: processedMenu,\n },\n );\n\n // Keyboard handler for accessibility shortcuts (WAI-ARIA Tabs Pattern)\n const handleKeyDown = useEvent((e: KeyboardEvent) => {\n // Reset focus-visible suppression on any keyboard interaction\n if (suppressFocusVisible) {\n setSuppressFocusVisible(false);\n }\n\n // F2 to start editing (standard rename shortcut)\n if (e.key === 'F2' && effectiveIsEditable && !isDisabled) {\n e.preventDefault();\n e.stopPropagation();\n inlineInputRef.current?.startEditing();\n }\n\n // Shift+F10 opens the menu (standard context menu shortcut)\n if (e.key === 'F10' && e.shiftKey && processedMenu) {\n e.preventDefault();\n e.stopPropagation();\n if (contextMenuOnly) {\n contextMenu.open();\n } else {\n setIsMenuOpen(true);\n }\n }\n\n // Delete key for direct tab deletion (ARIA Tabs pattern optional feature)\n // Skip when editing to allow normal text editing operations\n if (\n (e.key === 'Delete' || e.key === 'Backspace') &&\n isDeletable &&\n !isEditing\n ) {\n e.preventDefault();\n onDelete?.(itemKeyStr);\n }\n });\n\n const mods = useMemo(\n () => ({\n type: effectiveType,\n active: isActive,\n deletable: isDeletable,\n disabled: isDisabled,\n editing: isEditing,\n hovered: isHovered,\n focused: isFocused,\n 'focus-visible': effectiveFocusVisible,\n draggable: isDraggable,\n dragging: isDragging,\n }),\n [\n effectiveType,\n isActive,\n isDeletable,\n isDisabled,\n isEditing,\n isHovered,\n isFocused,\n effectiveFocusVisible,\n isDraggable,\n isDragging,\n ],\n );\n\n // Scroll active tab into view\n useEffect(() => {\n if (ref.current && isActive) {\n ref.current.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n }, [isActive]);\n\n // Overflow trigger (hidden in context-only mode)\n const menuAction =\n menuElement && !contextMenuOnly ? (\n <MenuTrigger isOpen={isMenuOpen} onOpenChange={setIsMenuOpen}>\n <ItemAction\n tabIndex={-1}\n icon={<MoreIcon />}\n {...effectiveMenuTriggerProps}\n />\n {menuElement}\n </MenuTrigger>\n ) : null;\n\n // Build delete button (only shown when no menu)\n const deleteAction = showDeleteButton ? (\n <ItemAction\n tabIndex={-1}\n icon={<CloseIcon />}\n tooltip=\"Close\"\n onPress={handleDelete}\n />\n ) : null;\n\n // Order: custom actions → menu trigger → delete button\n const actions =\n tabData.actions || menuAction || deleteAction ? (\n <>\n {tabData.actions}\n {menuAction}\n {deleteAction}\n </>\n ) : undefined;\n\n // Measure actions width to pass to Item for proper space allocation\n useLayoutEffect(() => {\n if (actions && actionsRef.current) {\n setActionsWidth(Math.round(actionsRef.current.offsetWidth));\n }\n }, [actions]);\n\n // Determine effective size\n const effectiveSize = tabData.size ?? size ?? 'medium';\n const itemSize =\n effectiveType === 'radio'\n ? RADIO_SIZE_MAP[effectiveSize === 'large' ? 'large' : 'medium']\n : effectiveSize;\n\n // Determine Item type prop\n const itemType =\n effectiveType === 'default' ? (isActive ? 'clear' : 'neutral') : 'neutral';\n\n // Determine shape - file type uses sharp edges\n const isFileType = effectiveType === 'file';\n const itemShape = isFileType ? 'sharp' : undefined;\n\n // Determine autoHideActions - tab-level overrides parent-level\n const effectiveAutoHideActions =\n tabData.autoHideActions ?? parentAutoHideActions;\n\n // Extract tab-specific props and pass through the rest (style props) to the Item\n const {\n title: _title,\n content: _content,\n key: _key,\n isDisabled: _isDisabled,\n prerender: _prerender,\n keepMounted: _keepMounted,\n size: _size,\n type: _type,\n actions: _actions,\n autoHideActions: _autoHideActions,\n isEditable: _isEditable,\n onTitleChange: _onTitleChange,\n menu: _menu,\n menuTriggerProps: _menuTriggerProps,\n menuProps: _menuProps,\n contextMenu: _contextMenu,\n onAction: _onAction,\n tooltip: tabTooltip,\n qa,\n qaVal,\n styles,\n ...itemStyleProps\n } = tabData;\n\n // Render title with editing support if editable\n // Override InlineInput's default `cursor: text` hover hint — in Tabs the\n // title sits inside a clickable tab, so a text caret cursor is misleading.\n //\n // When the title is a plain string we let InlineInput render it directly,\n // which lets the optimistic display kick in (avoids flicker if the parent's\n // `onTitleChange` updates the source asynchronously, e.g. inside a RAF).\n // For ReactNode titles (icons, badges, ...), preserve the original node.\n //\n // For editable tabs, route the tab's `tooltip` prop through InlineInput so\n // it owns the truncation + tooltip behaviour (and we pass `tooltip={false}`\n // to `TabElement` below to avoid double tooltips).\n const renderTitleDisplay =\n typeof tabData.title === 'string' ? undefined : () => tabData.title;\n const titleContent = effectiveIsEditable ? (\n <InlineInput\n ref={inlineInputRef}\n value={titleString}\n isEditing={isEditing}\n isDisabled={isDisabled}\n keyboardActivation={false}\n aria-label=\"Edit tab title\"\n styles={INLINE_INPUT_STYLES}\n renderDisplay={renderTitleDisplay}\n tooltip={tabTooltip ?? true}\n onEditingChange={handleEditingChange}\n onSubmit={handleSubmitEditing}\n onCancel={handleCancelEditing}\n />\n ) : (\n tabData.title\n );\n\n // Use the hook's targetRef when context menu is enabled\n const effectiveContainerRef =\n contextMenuEnabled && processedMenu ? contextMenu.targetRef : containerRef;\n\n // ARIA: indicate popup menu presence\n const ariaProps = processedMenu ? { 'aria-haspopup': 'menu' as const } : {};\n\n // Mods for TabContainer\n const containerMods = {\n ...mods,\n 'auto-hide-actions': effectiveAutoHideActions,\n };\n\n return (\n <TabContainer\n ref={effectiveContainerRef}\n data-size={itemSize}\n mods={containerMods}\n tokens={{ '$actions-width': `${actionsWidth}px` }}\n {...effectiveDragProps}\n >\n {/* Drop indicator before this tab */}\n {isDraggable && dropState && (\n <TabDropIndicator\n target={{ type: 'item', key: item.key, dropPosition: 'before' }}\n dropState={dropState}\n position=\"before\"\n />\n )}\n <TabElement\n preserveActionsSpace\n autoHideActions={effectiveAutoHideActions}\n as=\"button\"\n {...mergeProps(tabProps, hoverProps, focusProps, {\n onKeyDown: handleKeyDown,\n })}\n {...ariaProps}\n {...itemStyleProps}\n ref={ref}\n qa={qa ?? `Tab-${String(item.key)}`}\n qaVal={qaVal}\n styles={styles}\n mods={mods}\n isSelected={isActive}\n isDisabled={isDisabled}\n size={itemSize}\n type={itemType}\n shape={itemShape}\n actions={actions ? true : undefined}\n tooltip={effectiveIsEditable ? false : tabTooltip}\n >\n {titleContent}\n </TabElement>\n {/* Actions rendered outside the button for accessibility */}\n {actions && (\n <div\n ref={actionsRef}\n data-element=\"Actions\"\n {...ACTIONS_EVENT_HANDLERS}\n >\n <ItemActionProvider\n type={itemType}\n theme=\"default\"\n isDisabled={isDisabled}\n >\n {actions}\n </ItemActionProvider>\n </div>\n )}\n {contextMenuEnabled && processedMenu && contextMenu.rendered}\n {/* Drop indicator after the last tab */}\n {isDraggable && dropState && isLastTab && (\n <TabDropIndicator\n target={{ type: 'item', key: item.key, dropPosition: 'after' }}\n dropState={dropState}\n position=\"after\"\n />\n )}\n </TabContainer>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TabButton.js","names":["Menu","MenuTrigger","mergeProps"],"sources":["../../../../src/components/navigation/Tabs/TabButton.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n useDraggableItem,\n useFocus,\n useFocusVisible,\n useHover,\n useTab,\n} from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { CloseIcon, MoreIcon } from '../../../icons';\nimport { mergeProps } from '../../../utils/react';\nimport { CubeItemActionProps, ItemAction } from '../../actions/ItemAction';\nimport { ItemActionProvider } from '../../actions/ItemActionContext';\nimport { CubeMenuProps, Menu, MenuTrigger } from '../../actions/Menu';\nimport { useContextMenu } from '../../actions/use-context-menu';\nimport {\n CubeInlineInputRef,\n InlineInput,\n} from '../../content/InlineInput/InlineInput';\nimport { createMockDragState } from '../../shared/DraggableCollection';\n\nimport { POPOVER_PLACEMENT_BY_TABS_PLACEMENT } from './popover-placement';\nimport { TabContainer, TabElement } from './styled';\nimport { TabDropIndicator } from './TabDropIndicator';\nimport { useTabsContext } from './TabsContext';\nimport { ParsedTab, RADIO_SIZE_MAP } from './types';\n\nimport type { Key, Node } from '@react-types/shared';\nimport type { KeyboardEvent, MouseEvent, PointerEvent } from 'react';\nimport type { DraggableCollectionState } from 'react-stately';\n\n// =============================================================================\n// Event handlers for actions to prevent event propagation to tab button\n// =============================================================================\n\nconst ACTIONS_EVENT_HANDLERS = {\n onClick: (e: MouseEvent) => e.stopPropagation(),\n onPointerDown: (e: PointerEvent) => e.stopPropagation(),\n onPointerUp: (e: PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: MouseEvent) => e.stopPropagation(),\n onMouseUp: (e: MouseEvent) => e.stopPropagation(),\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation();\n }\n },\n};\n\n// Inherit the tab button's pointer cursor — InlineInput's default `cursor: text`\n// hover hint is misleading inside a clickable tab.\nconst INLINE_INPUT_STYLES = { cursor: 'inherit' } as const;\n\n// =============================================================================\n// Menu Processing Utilities\n// =============================================================================\n\ninterface MenuItemLikeProps {\n children?: ReactNode;\n isDisabled?: boolean;\n theme?: string;\n}\n\n/**\n * Extracts the raw key from a React element, stripping the \".$\" prefix\n * that React adds via Children.map/toArray.\n */\nfunction getRawKey(element: ReactElement): string | null {\n if (element.key == null) return null;\n const keyStr = String(element.key);\n return keyStr.startsWith('.$') ? keyStr.slice(2) : keyStr;\n}\n\n/**\n * Process menu items for predefined action keys (rename, delete).\n * Auto-adds labels and disables items when requirements aren't met.\n */\nfunction processMenuItems(\n children: ReactNode,\n effectiveIsEditable: boolean,\n isDeletable: boolean,\n): ReactNode {\n // Use Children.forEach instead of Children.toArray to avoid React prepending\n // \".$\" to element keys, which breaks selectedKeys matching in Menu.\n const result: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n result.push(child);\n return;\n }\n\n const childKey = getRawKey(child);\n const childProps = child.props as MenuItemLikeProps;\n\n // Handle predefined action keys\n if (childKey === 'rename') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: childProps.children ?? 'Rename',\n isDisabled: childProps.isDisabled ?? !effectiveIsEditable,\n }),\n );\n return;\n }\n if (childKey === 'delete') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: childProps.children ?? 'Delete',\n theme: childProps.theme ?? 'danger',\n isDisabled: childProps.isDisabled ?? !isDeletable,\n }),\n );\n return;\n }\n\n // Recursively process Menu.Section children\n if (childProps.children && typeof childProps.children !== 'string') {\n result.push(\n cloneElement(child as ReactElement<MenuItemLikeProps>, {\n children: processMenuItems(\n childProps.children,\n effectiveIsEditable,\n isDeletable,\n ),\n }),\n );\n return;\n }\n\n result.push(child);\n });\n\n return result;\n}\n\n/**\n * Check if menu children is empty (null, undefined, or empty fragment)\n */\nfunction isMenuEmpty(menu: ReactNode): boolean {\n if (menu === null || menu === undefined) return true;\n const children = Children.toArray(menu);\n return children.length === 0;\n}\n\n// =============================================================================\n// TabButton Props\n// =============================================================================\n\nexport interface TabButtonProps {\n /** React Aria collection item */\n item: Node<object>;\n /** Parsed tab data */\n tabData: ParsedTab;\n /** Whether this is the last tab (for drop indicator) */\n isLastTab?: boolean;\n}\n\n// =============================================================================\n// TabButton Component\n// =============================================================================\n\n/**\n * Individual tab button component.\n *\n * Uses TabsContext to access shared props, dramatically reducing prop drilling.\n * Handles:\n * - Tab selection and keyboard navigation\n * - Inline title editing\n * - Menu and context menu\n * - Drag-and-drop reordering\n * - Focus and hover states\n */\nexport function TabButton({ item, tabData, isLastTab }: TabButtonProps) {\n // Get shared context\n const {\n state,\n type,\n size,\n placement,\n autoHideActions: parentAutoHideActions,\n isEditable: parentIsEditable,\n menu: parentMenu,\n menuTriggerProps: parentMenuTriggerProps,\n menuProps: parentMenuProps,\n contextMenu: parentContextMenu,\n onAction: parentOnAction,\n onDelete,\n dragState,\n dropState,\n editingKey,\n startEditing,\n submitEditing,\n cancelEditing,\n } = useTabsContext();\n\n const ref = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const actionsRef = useRef<HTMLDivElement>(null);\n const inlineInputRef = useRef<CubeInlineInputRef>(null);\n const { tabProps } = useTab({ key: item.key }, state, ref);\n\n // Measure actions width for proper space allocation in Item\n const [actionsWidth, setActionsWidth] = useState(0);\n\n // Drag-and-drop support - only enable when both states are provided\n const isDraggable = !!dragState && !!dropState;\n\n // useDraggableItem must be called unconditionally (Rules of Hooks)\n // When dragState is undefined, we pass a minimal mock state to satisfy the hook\n const mockDragState = useMemo(\n () => createMockDragState(state.collection, state.selectionManager),\n [state.collection, state.selectionManager],\n );\n\n const dragResult = useDraggableItem(\n { key: item.key },\n dragState ?? mockDragState,\n );\n const effectiveDragProps = isDraggable ? dragResult.dragProps : {};\n const isDragging = isDraggable && dragResult.isDragging;\n\n // Controlled state for menu trigger (enables keyboard opening with Shift+F10)\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n // Hover, focus, and focus-visible state handling\n const { hoverProps, isHovered } = useHover({});\n const [isFocused, setIsFocused] = useState(false);\n const { focusProps } = useFocus({ onFocusChange: setIsFocused });\n const { isFocusVisible } = useFocusVisible();\n\n // Suppress focus-visible when restoring focus after editing\n const [suppressFocusVisible, setSuppressFocusVisible] = useState(false);\n const effectiveFocusVisible = isFocusVisible && !suppressFocusVisible;\n\n const isActive = state.selectedKey === item.key;\n const isDisabled = state.disabledKeys.has(item.key);\n const isDeletable = !!onDelete;\n const isEditing = editingKey === item.key;\n\n // Compute effective values - Tab-level overrides Tabs-level\n const effectiveIsEditable = tabData.isEditable ?? parentIsEditable ?? false;\n const effectiveMenu =\n tabData.menu === null ? null : tabData.menu ?? parentMenu;\n const effectiveMenuTriggerProps: Partial<CubeItemActionProps> = {\n ...parentMenuTriggerProps,\n ...tabData.menuTriggerProps,\n };\n const effectiveMenuProps: Partial<CubeMenuProps<object>> = {\n ...parentMenuProps,\n ...tabData.menuProps,\n };\n const effectiveContextMenu =\n tabData.contextMenu ?? parentContextMenu ?? false;\n const effectiveType = type ?? 'default';\n\n const contextMenuEnabled =\n effectiveContextMenu === true || effectiveContextMenu === 'context-only';\n const contextMenuOnly = effectiveContextMenu === 'context-only';\n\n // Inline close when no menu, or context-only (no overflow trigger)\n const showDeleteButton =\n isDeletable && (isMenuEmpty(effectiveMenu) || contextMenuOnly);\n\n // Process menu items for auto-labels and disabled states\n const processedMenu =\n effectiveMenu && !isMenuEmpty(effectiveMenu)\n ? processMenuItems(effectiveMenu, effectiveIsEditable, isDeletable)\n : null;\n\n const itemKeyStr = String(item.key);\n\n const handleDelete = useEvent(() => {\n onDelete?.(itemKeyStr);\n });\n\n const titleString =\n typeof tabData.title === 'string' ? tabData.title : itemKeyStr;\n\n const handleStartEditing = useEvent(() => {\n if (!effectiveIsEditable || isDisabled) return;\n startEditing(itemKeyStr, titleString);\n });\n\n const handleSubmitEditing = useEvent((newTitle: string) => {\n submitEditing(itemKeyStr, newTitle, tabData.onTitleChange);\n // Suppress focus-visible and restore focus to the tab button after editing\n setSuppressFocusVisible(true);\n ref.current?.focus();\n });\n\n const handleCancelEditing = useEvent(() => {\n cancelEditing();\n // Suppress focus-visible and restore focus to the tab button after editing\n setSuppressFocusVisible(true);\n ref.current?.focus();\n });\n\n const handleEditingChange = useEvent((editing: boolean) => {\n if (editing && !isEditing) {\n handleStartEditing();\n }\n });\n\n // Secondary defense against the Menu/InlineInput focus-theft race when a\n // consumer triggers rename from a menu item. `InlineInput` itself runs a\n // blur-side grace period after a programmatic `startEditing()` call (see\n // `PROGRAMMATIC_EDIT_BLUR_GRACE_MS`); this pass just re-focuses the input\n // across the Menu popover's exit transition (~350ms) in case another code\n // path (focus manager, host re-render) stole focus from it.\n //\n // The `seenEditingInput` guard ensures we don't reopen rename after the\n // user has already finished editing (Enter / Escape / blur-to-elsewhere):\n // once we've observed the editing input in the DOM and it later\n // disappears, the user committed/cancelled and we stop retrying.\n const renameInputSelector = 'input[aria-label=\"Edit tab title\"]';\n const scheduleRenameRefocus = useEvent(() => {\n let seenEditingInput = false;\n let cancelled = false;\n const timers: number[] = [];\n\n // Query the editing input via the tab button `ref` — that's always\n // wired up regardless of context-menu mode. `containerRef` is shadowed\n // by `contextMenu.targetRef` when context menu is enabled, and\n // `actionsRef` may never attach (e.g. `contextMenu=\"context-only\"` with\n // no delete button and no custom actions).\n const findEditingInput = (): HTMLInputElement | null =>\n (ref.current?.querySelector(renameInputSelector) ??\n null) as HTMLInputElement | null;\n\n const tick = () => {\n if (cancelled) return;\n\n const editingInput = findEditingInput();\n if (editingInput) {\n seenEditingInput = true;\n if (document.activeElement !== editingInput) {\n inlineInputRef.current?.focus();\n }\n\n return;\n }\n\n if (seenEditingInput) {\n cancelled = true;\n for (const t of timers) clearTimeout(t);\n }\n };\n\n requestAnimationFrame(tick);\n timers.push(window.setTimeout(tick, 50));\n timers.push(window.setTimeout(tick, 200));\n timers.push(window.setTimeout(tick, 400));\n });\n\n // Handle menu actions - predefined actions first, then callbacks\n const handleMenuAction = useEvent((action: Key) => {\n // Strip the \".$\" prefix that React adds via Children.toArray/map\n const actionStr = String(action);\n const normalizedAction = actionStr.startsWith('.$')\n ? actionStr.slice(2)\n : actionStr;\n\n // Handle predefined actions first (only if requirements are met)\n if (normalizedAction === 'rename' && effectiveIsEditable) {\n inlineInputRef.current?.startEditing();\n // Belt-and-suspenders: see `scheduleRenameRefocus` for the rationale.\n scheduleRenameRefocus();\n }\n if (normalizedAction === 'delete' && isDeletable) {\n onDelete?.(itemKeyStr);\n }\n // Call Tab-level onAction first (with normalized action)\n tabData.onAction?.(normalizedAction);\n // Then call Tabs-level onAction with tab key (with normalized action)\n parentOnAction?.(normalizedAction, itemKeyStr);\n });\n\n const menuElement = processedMenu ? (\n <Menu {...effectiveMenuProps} onAction={handleMenuAction}>\n {processedMenu}\n </Menu>\n ) : null;\n\n // Menus follow the same axis-aware popover rule as TabPicker so they always\n // open toward the panel area instead of past the bar's outer edge.\n const menuPopoverPlacement = POPOVER_PLACEMENT_BY_TABS_PLACEMENT[placement];\n\n const contextMenu = useContextMenu<HTMLDivElement, CubeMenuProps<object>>(\n Menu,\n { placement: menuPopoverPlacement },\n {\n ...effectiveMenuProps,\n onAction: handleMenuAction,\n children: processedMenu,\n },\n );\n\n // Keyboard handler for accessibility shortcuts (WAI-ARIA Tabs Pattern)\n const handleKeyDown = useEvent((e: KeyboardEvent) => {\n // Reset focus-visible suppression on any keyboard interaction\n if (suppressFocusVisible) {\n setSuppressFocusVisible(false);\n }\n\n // F2 to start editing (standard rename shortcut)\n if (e.key === 'F2' && effectiveIsEditable && !isDisabled) {\n e.preventDefault();\n e.stopPropagation();\n inlineInputRef.current?.startEditing();\n }\n\n // Shift+F10 opens the menu (standard context menu shortcut)\n if (e.key === 'F10' && e.shiftKey && processedMenu) {\n e.preventDefault();\n e.stopPropagation();\n if (contextMenuOnly) {\n contextMenu.open();\n } else {\n setIsMenuOpen(true);\n }\n }\n\n // Delete key for direct tab deletion (ARIA Tabs pattern optional feature)\n // Skip when editing to allow normal text editing operations\n if (\n (e.key === 'Delete' || e.key === 'Backspace') &&\n isDeletable &&\n !isEditing\n ) {\n e.preventDefault();\n onDelete?.(itemKeyStr);\n }\n });\n\n const mods = useMemo(\n () => ({\n type: effectiveType,\n placement,\n active: isActive,\n deletable: isDeletable,\n disabled: isDisabled,\n editing: isEditing,\n hovered: isHovered,\n focused: isFocused,\n 'focus-visible': effectiveFocusVisible,\n draggable: isDraggable,\n dragging: isDragging,\n }),\n [\n effectiveType,\n placement,\n isActive,\n isDeletable,\n isDisabled,\n isEditing,\n isHovered,\n isFocused,\n effectiveFocusVisible,\n isDraggable,\n isDragging,\n ],\n );\n\n // Scroll active tab into view\n useEffect(() => {\n if (ref.current && isActive) {\n ref.current.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n }, [isActive]);\n\n // Overflow trigger (hidden in context-only mode)\n const menuAction =\n menuElement && !contextMenuOnly ? (\n <MenuTrigger\n isOpen={isMenuOpen}\n placement={menuPopoverPlacement}\n onOpenChange={setIsMenuOpen}\n >\n <ItemAction\n tabIndex={-1}\n icon={<MoreIcon />}\n {...effectiveMenuTriggerProps}\n />\n {menuElement}\n </MenuTrigger>\n ) : null;\n\n // Build delete button (only shown when no menu)\n const deleteAction = showDeleteButton ? (\n <ItemAction\n tabIndex={-1}\n icon={<CloseIcon />}\n tooltip=\"Close\"\n onPress={handleDelete}\n />\n ) : null;\n\n // Order: custom actions → menu trigger → delete button\n const actions =\n tabData.actions || menuAction || deleteAction ? (\n <>\n {tabData.actions}\n {menuAction}\n {deleteAction}\n </>\n ) : undefined;\n\n // Measure actions width to pass to Item for proper space allocation\n useLayoutEffect(() => {\n if (actions && actionsRef.current) {\n setActionsWidth(Math.round(actionsRef.current.offsetWidth));\n }\n }, [actions]);\n\n // Determine effective size\n const effectiveSize = tabData.size ?? size ?? 'medium';\n const itemSize =\n effectiveType === 'radio'\n ? RADIO_SIZE_MAP[effectiveSize === 'large' ? 'large' : 'medium']\n : effectiveSize;\n\n // Determine Item type prop\n const itemType = 'clear';\n\n // Determine shape - file type uses sharp edges\n const isFileType = effectiveType === 'file';\n const itemShape = isFileType ? 'sharp' : undefined;\n\n // Determine autoHideActions - tab-level overrides parent-level\n const effectiveAutoHideActions =\n tabData.autoHideActions ?? parentAutoHideActions;\n\n // Extract tab-specific props and pass through the rest (style props) to the Item\n const {\n title: _title,\n content: _content,\n key: _key,\n isDisabled: _isDisabled,\n prerender: _prerender,\n keepMounted: _keepMounted,\n size: _size,\n actions: _actions,\n autoHideActions: _autoHideActions,\n isEditable: _isEditable,\n onTitleChange: _onTitleChange,\n menu: _menu,\n menuTriggerProps: _menuTriggerProps,\n menuProps: _menuProps,\n contextMenu: _contextMenu,\n onAction: _onAction,\n tooltip: tabTooltip,\n qa,\n qaVal,\n styles,\n ...itemStyleProps\n } = tabData;\n\n // Render title with editing support if editable\n // Override InlineInput's default `cursor: text` hover hint — in Tabs the\n // title sits inside a clickable tab, so a text caret cursor is misleading.\n //\n // When the title is a plain string we let InlineInput render it directly,\n // which lets the optimistic display kick in (avoids flicker if the parent's\n // `onTitleChange` updates the source asynchronously, e.g. inside a RAF).\n // For ReactNode titles (icons, badges, ...), preserve the original node.\n //\n // For editable tabs, route the tab's `tooltip` prop through InlineInput so\n // it owns the truncation + tooltip behaviour (and we pass `tooltip={false}`\n // to `TabElement` below to avoid double tooltips).\n const renderTitleDisplay =\n typeof tabData.title === 'string' ? undefined : () => tabData.title;\n const titleContent = effectiveIsEditable ? (\n <InlineInput\n ref={inlineInputRef}\n value={titleString}\n isEditing={isEditing}\n isDisabled={isDisabled}\n keyboardActivation={false}\n aria-label=\"Edit tab title\"\n styles={INLINE_INPUT_STYLES}\n renderDisplay={renderTitleDisplay}\n tooltip={tabTooltip ?? true}\n onEditingChange={handleEditingChange}\n onSubmit={handleSubmitEditing}\n onCancel={handleCancelEditing}\n />\n ) : (\n tabData.title\n );\n\n // Use the hook's targetRef when context menu is enabled\n const effectiveContainerRef =\n contextMenuEnabled && processedMenu ? contextMenu.targetRef : containerRef;\n\n // ARIA: indicate popup menu presence\n const ariaProps = processedMenu ? { 'aria-haspopup': 'menu' as const } : {};\n\n // Mods for TabContainer\n const containerMods = {\n ...mods,\n 'auto-hide-actions': effectiveAutoHideActions,\n };\n\n return (\n <TabContainer\n ref={effectiveContainerRef}\n data-size={itemSize}\n mods={containerMods}\n tokens={{ '$actions-width': `${actionsWidth}px` }}\n {...effectiveDragProps}\n >\n {/* Drop indicator before this tab */}\n {isDraggable && dropState && (\n <TabDropIndicator\n target={{ type: 'item', key: item.key, dropPosition: 'before' }}\n dropState={dropState}\n position=\"before\"\n />\n )}\n <TabElement\n preserveActionsSpace\n autoHideActions={effectiveAutoHideActions}\n as=\"button\"\n {...mergeProps(tabProps, hoverProps, focusProps, {\n onKeyDown: handleKeyDown,\n })}\n {...ariaProps}\n {...itemStyleProps}\n ref={ref}\n qa={qa ?? `Tab-${String(item.key)}`}\n qaVal={qaVal}\n styles={styles}\n mods={mods}\n isSelected={isActive}\n isDisabled={isDisabled}\n size={itemSize}\n type={itemType}\n shape={itemShape}\n actions={actions ? true : undefined}\n tooltip={effectiveIsEditable ? false : tabTooltip}\n >\n {titleContent}\n </TabElement>\n {/* Actions rendered outside the button for accessibility */}\n {actions && (\n <div\n ref={actionsRef}\n data-element=\"Actions\"\n {...ACTIONS_EVENT_HANDLERS}\n >\n <ItemActionProvider\n type={itemType}\n theme=\"default\"\n isDisabled={isDisabled}\n >\n {actions}\n </ItemActionProvider>\n </div>\n )}\n {contextMenuEnabled && processedMenu && contextMenu.rendered}\n {/* Drop indicator after the last tab */}\n {isDraggable && dropState && isLastTab && (\n <TabDropIndicator\n target={{ type: 'item', key: item.key, dropPosition: 'after' }}\n dropState={dropState}\n position=\"after\"\n />\n )}\n </TabContainer>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { DropIndicatorElement } from "./styled.js";
3
+ import { useTabsContext } from "./TabsContext.js";
3
4
  import { useEffect, useRef, useState } from "react";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  import { useDropIndicator } from "react-aria";
@@ -8,12 +9,15 @@ import { useDropIndicator } from "react-aria";
8
9
  /**
9
10
  * Visual drop indicator for drag-and-drop tab reordering.
10
11
  *
11
- * Renders a vertical line showing where the dragged tab will be dropped.
12
- * Only visible when the drop target is active.
12
+ * Renders a bar showing where the dragged tab will be dropped. The bar is
13
+ * vertical for horizontal Tabs (`placement: 'top' | 'bottom'`) and horizontal
14
+ * for vertical Tabs (`placement: 'left' | 'right'`). Only visible when the
15
+ * drop target is active.
13
16
  */
14
17
  function TabDropIndicator({ target, dropState, position }) {
15
18
  const ref = useRef(null);
16
19
  const [, setTick] = useState(0);
20
+ const { placement } = useTabsContext();
17
21
  const { dropIndicatorProps, isHidden, isDropTarget } = useDropIndicator({ target }, dropState, ref);
18
22
  useEffect(() => {
19
23
  const element = ref.current;
@@ -34,7 +38,8 @@ function TabDropIndicator({ target, dropState, position }) {
34
38
  mods: {
35
39
  "drop-target": isDropTarget,
36
40
  after: position === "after",
37
- before: position === "before"
41
+ before: position === "before",
42
+ placement
38
43
  }
39
44
  });
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TabDropIndicator.js","names":[],"sources":["../../../../src/components/navigation/Tabs/TabDropIndicator.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useDropIndicator } from 'react-aria';\n\nimport { DropIndicatorElement } from './styled';\n\nimport type { DropTarget } from 'react-aria';\nimport type { DroppableCollectionState } from 'react-stately';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TabDropIndicatorProps {\n /** Drop target configuration */\n target: DropTarget;\n /** Droppable collection state from React Aria */\n dropState: DroppableCollectionState;\n /** Position of the indicator (before or after the tab) */\n position: 'before' | 'after';\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Visual drop indicator for drag-and-drop tab reordering.\n *\n * Renders a vertical line showing where the dragged tab will be dropped.\n * Only visible when the drop target is active.\n */\nexport function TabDropIndicator({\n target,\n dropState,\n position,\n}: TabDropIndicatorProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [, setTick] = useState(0);\n\n const { dropIndicatorProps, isHidden, isDropTarget } = useDropIndicator(\n { target },\n dropState,\n ref,\n );\n\n // Re-evaluate drop target registration when tab layout changes.\n // Active only while the indicator is rendered in the DOM (during drags).\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const tabList = element.closest('[data-element=\"TabList\"]');\n if (!tabList) return;\n\n const observer = new ResizeObserver(() => {\n setTick((n) => n + 1);\n });\n\n observer.observe(tabList);\n\n return () => observer.disconnect();\n }, [isHidden]);\n\n if (isHidden) {\n return null;\n }\n\n return (\n <DropIndicatorElement\n ref={ref}\n role=\"option\"\n {...dropIndicatorProps}\n mods={{\n 'drop-target': isDropTarget,\n after: position === 'after',\n before: position === 'before',\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,SAAgB,iBAAiB,EAC/B,QACA,WACA,YACwB;CACxB,MAAM,MAAM,OAAuB,KAAK;CACxC,MAAM,GAAG,WAAW,SAAS,EAAE;CAE/B,MAAM,EAAE,oBAAoB,UAAU,iBAAiB,iBACrD,EAAE,QAAQ,EACV,WACA,IACD;AAID,iBAAgB;EACd,MAAM,UAAU,IAAI;AACpB,MAAI,CAAC,QAAS;EAEd,MAAM,UAAU,QAAQ,QAAQ,6BAA2B;AAC3D,MAAI,CAAC,QAAS;EAEd,MAAM,WAAW,IAAI,qBAAqB;AACxC,YAAS,MAAM,IAAI,EAAE;IACrB;AAEF,WAAS,QAAQ,QAAQ;AAEzB,eAAa,SAAS,YAAY;IACjC,CAAC,SAAS,CAAC;AAEd,KAAI,SACF,QAAO;AAGT,QACE,oBAAC;EACM;EACL,MAAK;EACL,GAAI;EACJ,MAAM;GACJ,eAAe;GACf,OAAO,aAAa;GACpB,QAAQ,aAAa;GACtB;GACD"}
1
+ {"version":3,"file":"TabDropIndicator.js","names":[],"sources":["../../../../src/components/navigation/Tabs/TabDropIndicator.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useDropIndicator } from 'react-aria';\n\nimport { DropIndicatorElement } from './styled';\nimport { useTabsContext } from './TabsContext';\n\nimport type { DropTarget } from 'react-aria';\nimport type { DroppableCollectionState } from 'react-stately';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TabDropIndicatorProps {\n /** Drop target configuration */\n target: DropTarget;\n /** Droppable collection state from React Aria */\n dropState: DroppableCollectionState;\n /** Position of the indicator (before or after the tab) */\n position: 'before' | 'after';\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Visual drop indicator for drag-and-drop tab reordering.\n *\n * Renders a bar showing where the dragged tab will be dropped. The bar is\n * vertical for horizontal Tabs (`placement: 'top' | 'bottom'`) and horizontal\n * for vertical Tabs (`placement: 'left' | 'right'`). Only visible when the\n * drop target is active.\n */\nexport function TabDropIndicator({\n target,\n dropState,\n position,\n}: TabDropIndicatorProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [, setTick] = useState(0);\n const { placement } = useTabsContext();\n\n const { dropIndicatorProps, isHidden, isDropTarget } = useDropIndicator(\n { target },\n dropState,\n ref,\n );\n\n // Re-evaluate drop target registration when tab layout changes.\n // Active only while the indicator is rendered in the DOM (during drags).\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const tabList = element.closest('[data-element=\"TabList\"]');\n if (!tabList) return;\n\n const observer = new ResizeObserver(() => {\n setTick((n) => n + 1);\n });\n\n observer.observe(tabList);\n\n return () => observer.disconnect();\n }, [isHidden]);\n\n if (isHidden) {\n return null;\n }\n\n return (\n <DropIndicatorElement\n ref={ref}\n role=\"option\"\n {...dropIndicatorProps}\n mods={{\n 'drop-target': isDropTarget,\n after: position === 'after',\n before: position === 'before',\n placement,\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,SAAgB,iBAAiB,EAC/B,QACA,WACA,YACwB;CACxB,MAAM,MAAM,OAAuB,KAAK;CACxC,MAAM,GAAG,WAAW,SAAS,EAAE;CAC/B,MAAM,EAAE,cAAc,gBAAgB;CAEtC,MAAM,EAAE,oBAAoB,UAAU,iBAAiB,iBACrD,EAAE,QAAQ,EACV,WACA,IACD;AAID,iBAAgB;EACd,MAAM,UAAU,IAAI;AACpB,MAAI,CAAC,QAAS;EAEd,MAAM,UAAU,QAAQ,QAAQ,6BAA2B;AAC3D,MAAI,CAAC,QAAS;EAEd,MAAM,WAAW,IAAI,qBAAqB;AACxC,YAAS,MAAM,IAAI,EAAE;IACrB;AAEF,WAAS,QAAQ,QAAQ;AAEzB,eAAa,SAAS,YAAY;IACjC,CAAC,SAAS,CAAC;AAEd,KAAI,SACF,QAAO;AAGT,QACE,oBAAC;EACM;EACL,MAAK;EACL,GAAI;EACJ,MAAM;GACJ,eAAe;GACf,OAAO,aAAa;GACpB,QAAQ,aAAa;GACrB;GACD;GACD"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { TabPanelElement } from "./styled.js";
3
3
  import { useEffect, useMemo, useRef } from "react";
4
4
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
@@ -1,7 +1,8 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.138.6 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.140.0 | Cube Dev Team */
2
2
  import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
3
3
  import { CloseIcon } from "../../../icons/CloseIcon.js";
4
4
  import { MoreIcon } from "../../../icons/MoreIcon.js";
5
+ import { POPOVER_PLACEMENT_BY_TABS_PLACEMENT } from "./popover-placement.js";
5
6
  import { FilterPicker } from "../../fields/FilterPicker/FilterPicker.js";
6
7
  import { jsx } from "react/jsx-runtime";
7
8
 
@@ -12,8 +13,11 @@ import { jsx } from "react/jsx-runtime";
12
13
  * Used in the Tabs suffix area when tabs overflow to provide quick navigation
13
14
  * to any tab without scrolling.
14
15
  */
15
- function TabPicker({ tabs, selectedKey, onSelect, onDelete, size, type = "default", isReorderable, onReorder }) {
16
+ function TabPicker({ tabs, selectedKey, onSelect, onDelete, size, type = "default", placement = "top", isReorderable, onReorder }) {
16
17
  const isDeletable = !!onDelete;
18
+ const pickerSize = size === "xsmall" ? "small" : size;
19
+ const showBorderDivider = type === "file";
20
+ const isVertical = placement === "left" || placement === "right";
17
21
  return /* @__PURE__ */ jsx(FilterPicker, {
18
22
  selectionMode: "single",
19
23
  selectedKey,
@@ -21,11 +25,12 @@ function TabPicker({ tabs, selectedKey, onSelect, onDelete, size, type = "defaul
21
25
  icon: /* @__PURE__ */ jsx(MoreIcon, {}),
22
26
  rightIcon: null,
23
27
  shape: "sharp",
24
- type: "neutral",
25
- size: size === "xsmall" ? "small" : size,
26
- styles: { border: type === "file" ? {
28
+ type: "clear",
29
+ size: pickerSize,
30
+ placement: POPOVER_PLACEMENT_BY_TABS_PLACEMENT[placement],
31
+ styles: { border: showBorderDivider ? {
27
32
  "": 0,
28
- "!:first-child": "left"
33
+ "!:first-child": isVertical ? "top" : "left"
29
34
  } : 0 },
30
35
  triggerStyles: { border: 0 },
31
36
  "aria-label": "Select tab",
@@ -1 +1 @@
1
- {"version":3,"file":"TabPicker.js","names":[],"sources":["../../../../src/components/navigation/Tabs/TabPicker.tsx"],"sourcesContent":["import { CloseIcon, MoreIcon } from '../../../icons';\nimport { ItemAction } from '../../actions/ItemAction';\nimport { FilterPicker } from '../../fields/FilterPicker/FilterPicker';\n\nimport type { ParsedTab, TabSize, TabType } from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TabPickerProps {\n /** Ordered list of parsed tabs to display in the picker */\n tabs: ParsedTab[];\n /** Currently selected tab key */\n selectedKey: string | null;\n /** Callback when a tab is selected from the picker */\n onSelect: (key: string) => void;\n /** Callback when a tab should be deleted. When provided, shows delete action on items. */\n onDelete?: (key: string) => void;\n /** Size of the picker trigger button */\n size?: TabSize;\n /** Type of the parent Tabs component (for border styling) */\n type?: TabType;\n /** Enable drag-and-drop reordering of items in the picker dropdown */\n isReorderable?: boolean;\n /** Callback when items are reordered via drag-and-drop */\n onReorder?: (newOrder: string[]) => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Tab picker component that displays a dropdown menu of all tabs.\n *\n * Used in the Tabs suffix area when tabs overflow to provide quick navigation\n * to any tab without scrolling.\n */\nexport function TabPicker({\n tabs,\n selectedKey,\n onSelect,\n onDelete,\n size,\n type = 'default',\n isReorderable,\n onReorder,\n}: TabPickerProps) {\n const isDeletable = !!onDelete;\n\n // Map TabSize to FilterPicker size (xsmall -> small)\n const pickerSize = size === 'xsmall' ? 'small' : size;\n\n // Only show border divider for file type\n const showBorderDivider = type === 'file';\n\n return (\n <FilterPicker\n selectionMode=\"single\"\n selectedKey={selectedKey}\n renderSummary={false}\n icon={<MoreIcon />}\n rightIcon={null}\n shape=\"sharp\"\n type=\"neutral\"\n size={pickerSize}\n // Apply border to wrapper (FilterPickerWrapper) so :first-child evaluates\n // relative to Suffix container, not the internal DialogTrigger\n styles={{\n border: showBorderDivider\n ? {\n '': 0,\n '!:first-child': 'left',\n }\n : 0,\n }}\n triggerStyles={{ border: 0 }}\n aria-label=\"Select tab\"\n isReorderable={isReorderable}\n onReorder={onReorder}\n onSelectionChange={(key) => {\n if (key != null) {\n onSelect(String(key));\n }\n }}\n >\n {tabs.map((tab) => (\n <FilterPicker.Item\n key={tab.key}\n icon={tab.icon}\n textValue={\n typeof tab.title === 'string' ? tab.title : String(tab.key)\n }\n autoHideActions={isDeletable}\n actions={\n isDeletable ? (\n <ItemAction\n icon={<CloseIcon />}\n aria-label=\"Close\"\n onPress={() => {\n onDelete(tab.key);\n }}\n />\n ) : undefined\n }\n >\n {tab.title}\n </FilterPicker.Item>\n ))}\n </FilterPicker>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAuCA,SAAgB,UAAU,EACxB,MACA,aACA,UACA,UACA,MACA,OAAO,WACP,eACA,aACiB;CACjB,MAAM,cAAc,CAAC,CAAC;AAQtB,QACE,oBAAC;EACC,eAAc;EACD;EACb,eAAe;EACf,MAAM,oBAAC,aAAW;EAClB,WAAW;EACX,OAAM;EACN,MAAK;EACL,MAde,SAAS,WAAW,UAAU;EAiB7C,QAAQ,EACN,QAfoB,SAAS,SAgBzB;GACE,IAAI;GACJ,iBAAiB;GAClB,GACD,GACL;EACD,eAAe,EAAE,QAAQ,GAAG;EAC5B,cAAW;EACI;EACJ;EACX,oBAAoB,QAAQ;AAC1B,OAAI,OAAO,KACT,UAAS,OAAO,IAAI,CAAC;;YAIxB,KAAK,KAAK,QACT,oBAAC,aAAa;GAEZ,MAAM,IAAI;GACV,WACE,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,OAAO,IAAI,IAAI;GAE7D,iBAAiB;GACjB,SACE,cACE,oBAAC;IACC,MAAM,oBAAC,cAAY;IACnB,cAAW;IACX,eAAe;AACb,cAAS,IAAI,IAAI;;KAEnB,GACA;aAGL,IAAI;KAlBA,IAAI,IAmBS,CACpB;GACW"}
1
+ {"version":3,"file":"TabPicker.js","names":[],"sources":["../../../../src/components/navigation/Tabs/TabPicker.tsx"],"sourcesContent":["import { CloseIcon, MoreIcon } from '../../../icons';\nimport { ItemAction } from '../../actions/ItemAction';\nimport { FilterPicker } from '../../fields/FilterPicker/FilterPicker';\n\nimport { POPOVER_PLACEMENT_BY_TABS_PLACEMENT } from './popover-placement';\n\nimport type { ParsedTab, TabPlacement, TabSize, TabType } from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TabPickerProps {\n /** Ordered list of parsed tabs to display in the picker */\n tabs: ParsedTab[];\n /** Currently selected tab key */\n selectedKey: string | null;\n /** Callback when a tab is selected from the picker */\n onSelect: (key: string) => void;\n /** Callback when a tab should be deleted. When provided, shows delete action on items. */\n onDelete?: (key: string) => void;\n /** Size of the picker trigger button */\n size?: TabSize;\n /** Type of the parent Tabs component (for border styling) */\n type?: TabType;\n /** Placement of the parent Tabs component (controls divider + popover placement) */\n placement?: TabPlacement;\n /** Enable drag-and-drop reordering of items in the picker dropdown */\n isReorderable?: boolean;\n /** Callback when items are reordered via drag-and-drop */\n onReorder?: (newOrder: string[]) => void;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Tab picker component that displays a dropdown menu of all tabs.\n *\n * Used in the Tabs suffix area when tabs overflow to provide quick navigation\n * to any tab without scrolling.\n */\nexport function TabPicker({\n tabs,\n selectedKey,\n onSelect,\n onDelete,\n size,\n type = 'default',\n placement = 'top',\n isReorderable,\n onReorder,\n}: TabPickerProps) {\n const isDeletable = !!onDelete;\n\n // Map TabSize to FilterPicker size (xsmall -> small)\n const pickerSize = size === 'xsmall' ? 'small' : size;\n\n // Only show border divider for file type\n const showBorderDivider = type === 'file';\n const isVertical = placement === 'left' || placement === 'right';\n\n return (\n <FilterPicker\n selectionMode=\"single\"\n selectedKey={selectedKey}\n renderSummary={false}\n icon={<MoreIcon />}\n rightIcon={null}\n shape=\"sharp\"\n type=\"clear\"\n size={pickerSize}\n placement={POPOVER_PLACEMENT_BY_TABS_PLACEMENT[placement]}\n // Apply border to wrapper (FilterPickerWrapper) so :first-child evaluates\n // relative to Suffix container, not the internal DialogTrigger. The\n // divider side flips with the bar's orientation.\n styles={{\n border: showBorderDivider\n ? {\n '': 0,\n '!:first-child': isVertical ? 'top' : 'left',\n }\n : 0,\n }}\n triggerStyles={{ border: 0 }}\n aria-label=\"Select tab\"\n isReorderable={isReorderable}\n onReorder={onReorder}\n onSelectionChange={(key) => {\n if (key != null) {\n onSelect(String(key));\n }\n }}\n >\n {tabs.map((tab) => (\n <FilterPicker.Item\n key={tab.key}\n icon={tab.icon}\n textValue={\n typeof tab.title === 'string' ? tab.title : String(tab.key)\n }\n autoHideActions={isDeletable}\n actions={\n isDeletable ? (\n <ItemAction\n icon={<CloseIcon />}\n aria-label=\"Close\"\n onPress={() => {\n onDelete(tab.key);\n }}\n />\n ) : undefined\n }\n >\n {tab.title}\n </FilterPicker.Item>\n ))}\n </FilterPicker>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AA2CA,SAAgB,UAAU,EACxB,MACA,aACA,UACA,UACA,MACA,OAAO,WACP,YAAY,OACZ,eACA,aACiB;CACjB,MAAM,cAAc,CAAC,CAAC;CAGtB,MAAM,aAAa,SAAS,WAAW,UAAU;CAGjD,MAAM,oBAAoB,SAAS;CACnC,MAAM,aAAa,cAAc,UAAU,cAAc;AAEzD,QACE,oBAAC;EACC,eAAc;EACD;EACb,eAAe;EACf,MAAM,oBAAC,aAAW;EAClB,WAAW;EACX,OAAM;EACN,MAAK;EACL,MAAM;EACN,WAAW,oCAAoC;EAI/C,QAAQ,EACN,QAAQ,oBACJ;GACE,IAAI;GACJ,iBAAiB,aAAa,QAAQ;GACvC,GACD,GACL;EACD,eAAe,EAAE,QAAQ,GAAG;EAC5B,cAAW;EACI;EACJ;EACX,oBAAoB,QAAQ;AAC1B,OAAI,OAAO,KACT,UAAS,OAAO,IAAI,CAAC;;YAIxB,KAAK,KAAK,QACT,oBAAC,aAAa;GAEZ,MAAM,IAAI;GACV,WACE,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,OAAO,IAAI,IAAI;GAE7D,iBAAiB;GACjB,SACE,cACE,oBAAC;IACC,MAAM,oBAAC,cAAY;IACnB,cAAW;IACX,eAAe;AACb,cAAS,IAAI,IAAI;;KAEnB,GACA;aAGL,IAAI;KAlBA,IAAI,IAmBS,CACpB;GACW"}