@cube-dev/ui-kit 0.158.0 → 0.159.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 (571) hide show
  1. package/dist/CHANGELOG.md +139 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +10 -4
  20. package/dist/components/actions/Button/Button.js.map +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  25. package/dist/components/actions/CommandMenu/styled.js +1 -1
  26. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  27. package/dist/components/actions/ItemActionContext.js +1 -1
  28. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  29. package/dist/components/actions/Link/Link.js +1 -1
  30. package/dist/components/actions/Menu/Menu.js +1 -1
  31. package/dist/components/actions/Menu/MenuItem.js +1 -1
  32. package/dist/components/actions/Menu/MenuSection.js +1 -1
  33. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  36. package/dist/components/actions/Menu/context.js +1 -1
  37. package/dist/components/actions/Menu/styled.js +1 -1
  38. package/dist/components/actions/index.js +1 -1
  39. package/dist/components/actions/use-action.js +1 -1
  40. package/dist/components/actions/use-anchored-menu.js +1 -1
  41. package/dist/components/actions/use-context-menu.js +1 -1
  42. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  43. package/dist/components/content/Alert/Alert.js +1 -1
  44. package/dist/components/content/Alert/use-alert.js +1 -1
  45. package/dist/components/content/Avatar/Avatar.js +1 -1
  46. package/dist/components/content/Badge/Badge.js +1 -1
  47. package/dist/components/content/Card/Card.js +1 -1
  48. package/dist/components/content/Content.js +1 -1
  49. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  50. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  51. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  52. package/dist/components/content/Divider.js +1 -1
  53. package/dist/components/content/Footer.js +1 -1
  54. package/dist/components/content/Header.js +1 -1
  55. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  56. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  57. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  58. package/dist/components/content/Item/Item.d.ts +7 -0
  59. package/dist/components/content/Item/Item.js +13 -6
  60. package/dist/components/content/Item/Item.js.map +1 -1
  61. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  62. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  63. package/dist/components/content/Layout/GridLayout.js +1 -1
  64. package/dist/components/content/Layout/Layout.js +1 -1
  65. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  66. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  67. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  68. package/dist/components/content/Layout/LayoutContent.js +1 -1
  69. package/dist/components/content/Layout/LayoutContext.js +1 -1
  70. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  71. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  72. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  73. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutPane.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  76. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  78. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  79. package/dist/components/content/Layout/index.js +1 -1
  80. package/dist/components/content/Layout/utils.js +1 -1
  81. package/dist/components/content/Paragraph.js +1 -1
  82. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  83. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  84. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  85. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  86. package/dist/components/content/Result/Result.js +1 -1
  87. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  88. package/dist/components/content/Tag/Tag.js +1 -1
  89. package/dist/components/content/Text.js +1 -1
  90. package/dist/components/content/TextItem/TextItem.js +1 -1
  91. package/dist/components/content/Title.js +1 -1
  92. package/dist/components/content/Tree/Tree.js +1 -1
  93. package/dist/components/content/Tree/TreeNode.js +1 -1
  94. package/dist/components/content/Tree/styled.js +1 -1
  95. package/dist/components/content/Tree/tree-index.js +1 -1
  96. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  97. package/dist/components/content/Tree/use-load-data.js +1 -1
  98. package/dist/components/content/highlightText.js +1 -1
  99. package/dist/components/content/use-auto-tooltip.js +41 -32
  100. package/dist/components/content/use-auto-tooltip.js.map +1 -1
  101. package/dist/components/data/DataTable/DataTable.js +82 -24
  102. package/dist/components/data/DataTable/DataTable.js.map +1 -1
  103. package/dist/components/data/DataTable/types.d.ts +56 -1
  104. package/dist/components/data/ItemTable/ItemTable.js +13 -5
  105. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  106. package/dist/components/data/ItemTable/ItemTableBulkBar.js +3 -7
  107. package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +1 -1
  108. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  109. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  110. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  111. package/dist/components/data/ItemTable/types.d.ts +19 -0
  112. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  113. package/dist/components/data/TableBase/RowCollection.js +5 -3
  114. package/dist/components/data/TableBase/RowCollection.js.map +1 -1
  115. package/dist/components/data/TableBase/TableHeaderCell.js +115 -0
  116. package/dist/components/data/TableBase/TableHeaderCell.js.map +1 -0
  117. package/dist/components/data/TableBase/TableRow.js +1 -1
  118. package/dist/components/data/TableBase/TableView.js +195 -33
  119. package/dist/components/data/TableBase/TableView.js.map +1 -1
  120. package/dist/components/data/TableBase/column-menu.d.ts +36 -0
  121. package/dist/components/data/TableBase/column-menu.js +104 -0
  122. package/dist/components/data/TableBase/column-menu.js.map +1 -0
  123. package/dist/components/data/TableBase/column-tint.js +168 -0
  124. package/dist/components/data/TableBase/column-tint.js.map +1 -0
  125. package/dist/components/data/TableBase/index.d.ts +3 -2
  126. package/dist/components/data/TableBase/row-menu.js +11 -6
  127. package/dist/components/data/TableBase/row-menu.js.map +1 -1
  128. package/dist/components/data/TableBase/styled.js +45 -16
  129. package/dist/components/data/TableBase/styled.js.map +1 -1
  130. package/dist/components/data/TableBase/types.d.ts +104 -6
  131. package/dist/components/data/TableBase/types.js +1 -1
  132. package/dist/components/data/TableBase/types.js.map +1 -1
  133. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  134. package/dist/components/data/TableBase/use-column-order.js +100 -0
  135. package/dist/components/data/TableBase/use-column-order.js.map +1 -0
  136. package/dist/components/data/TableBase/use-container-width.js +1 -1
  137. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  138. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  139. package/dist/components/data/TableBase/use-table-columns.js +24 -2
  140. package/dist/components/data/TableBase/use-table-columns.js.map +1 -1
  141. package/dist/components/data/TableBase/use-table-search.js +1 -1
  142. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  143. package/dist/components/data/TableBase/use-table-sort.js +20 -1
  144. package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
  145. package/dist/components/data/TableBase/use-table-sorts.js +40 -1
  146. package/dist/components/data/TableBase/use-table-sorts.js.map +1 -1
  147. package/dist/components/data/TableBase/use-table-storage.d.ts +1 -1
  148. package/dist/components/data/TableBase/use-table-storage.js +6 -2
  149. package/dist/components/data/TableBase/use-table-storage.js.map +1 -1
  150. package/dist/components/data/index.d.ts +2 -1
  151. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  152. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  153. package/dist/components/fields/Checkbox/context.js +1 -1
  154. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  155. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  156. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  157. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  158. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  159. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  160. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  161. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  162. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  163. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  164. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  165. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  166. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  167. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  168. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  169. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  170. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  171. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  172. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  173. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  174. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  175. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  176. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  177. package/dist/components/fields/DatePicker/period.js +1 -1
  178. package/dist/components/fields/DatePicker/props.js +1 -1
  179. package/dist/components/fields/DatePicker/utils.js +1 -1
  180. package/dist/components/fields/FileInput/FileInput.js +1 -1
  181. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  182. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  183. package/dist/components/fields/Input/Input.js +1 -1
  184. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  185. package/dist/components/fields/ListBox/ListBox.js +1 -1
  186. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  187. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  188. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  189. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  190. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  191. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  192. package/dist/components/fields/Picker/Picker.js +1 -1
  193. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  194. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  195. package/dist/components/fields/RadioGroup/context.js +1 -1
  196. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  197. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  198. package/dist/components/fields/Select/Select.js +1 -1
  199. package/dist/components/fields/Slider/Gradation.js +1 -1
  200. package/dist/components/fields/Slider/HueSlider.js +1 -1
  201. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  202. package/dist/components/fields/Slider/Slider.js +1 -1
  203. package/dist/components/fields/Slider/SliderBase.js +1 -1
  204. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  205. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  206. package/dist/components/fields/Slider/elements.js +1 -1
  207. package/dist/components/fields/Slider/index.js +1 -1
  208. package/dist/components/fields/Switch/Switch.js +1 -1
  209. package/dist/components/fields/TextArea/TextArea.js +1 -1
  210. package/dist/components/fields/TextInput/TextInput.js +1 -1
  211. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  212. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  213. package/dist/components/fields/color/ColorPanel.js +1 -1
  214. package/dist/components/fields/color/ColorSwatch.js +1 -1
  215. package/dist/components/fields/color/channels.js +1 -1
  216. package/dist/components/fields/color/color.js +1 -1
  217. package/dist/components/fields/color/context.js +1 -1
  218. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  219. package/dist/components/form/Form/Field.js +1 -1
  220. package/dist/components/form/Form/Form.js +1 -1
  221. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  222. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  223. package/dist/components/form/Form/SubmitError.js +1 -1
  224. package/dist/components/form/Form/index.js +1 -1
  225. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  226. package/dist/components/form/Form/use-field/use-field.js +1 -1
  227. package/dist/components/form/Form/use-form.js +1 -1
  228. package/dist/components/form/Form/validation.js +1 -1
  229. package/dist/components/form/Label.js +1 -1
  230. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  231. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  232. package/dist/components/form/validation/use-validation-props.js +1 -1
  233. package/dist/components/form/wrapper.js +1 -1
  234. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  235. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  236. package/dist/components/layout/Board/Board.js +1 -1
  237. package/dist/components/layout/Board/BoardProvider.js +1 -1
  238. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  239. package/dist/components/layout/Board/Widget.js +1 -1
  240. package/dist/components/layout/Board/WidgetHost.js +1 -1
  241. package/dist/components/layout/Board/board-context.js +1 -1
  242. package/dist/components/layout/Board/board-store.js +1 -1
  243. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  244. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  245. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  246. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  247. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  248. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  249. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  250. package/dist/components/layout/Board/index.js +1 -1
  251. package/dist/components/layout/Board/responsive-utils.js +1 -1
  252. package/dist/components/layout/Board/use-board-layout.js +1 -1
  253. package/dist/components/layout/Board/use-board-registry.js +1 -1
  254. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  255. package/dist/components/layout/Board/use-board-selection.js +1 -1
  256. package/dist/components/layout/Flex.js +1 -1
  257. package/dist/components/layout/Flow.js +1 -1
  258. package/dist/components/layout/Grid.js +1 -1
  259. package/dist/components/layout/Panel.js +1 -1
  260. package/dist/components/layout/Prefix.js +1 -1
  261. package/dist/components/layout/ResizablePanel.js +1 -1
  262. package/dist/components/layout/Space.js +1 -1
  263. package/dist/components/layout/Suffix.js +1 -1
  264. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  265. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  266. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  267. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  268. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  269. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  270. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  271. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  272. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  273. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  274. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  275. package/dist/components/navigation/Tabs/styled.js +1 -1
  276. package/dist/components/navigation/Tabs/types.js +1 -1
  277. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  278. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  279. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  280. package/dist/components/other/Calendar/Calendar.js +1 -1
  281. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  282. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  283. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  284. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  285. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  286. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  287. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  288. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  289. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  290. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  291. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  292. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  293. package/dist/components/overlays/Dialog/context.js +1 -1
  294. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  295. package/dist/components/overlays/Modal/Modal.js +1 -1
  296. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  297. package/dist/components/overlays/Modal/Overlay.js +1 -1
  298. package/dist/components/overlays/Modal/Popover.js +1 -1
  299. package/dist/components/overlays/Modal/Tray.js +1 -1
  300. package/dist/components/overlays/Modal/Underlay.js +1 -1
  301. package/dist/components/overlays/Notifications/Notification.js +1 -1
  302. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  303. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  304. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  305. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  306. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  307. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  308. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  309. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  310. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  311. package/dist/components/overlays/Notifications/index.js +1 -1
  312. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  313. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  314. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  315. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  316. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  317. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  318. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  319. package/dist/components/overlays/Toast/index.js +1 -1
  320. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  321. package/dist/components/overlays/Toast/useToast.js +1 -1
  322. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  323. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  324. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  325. package/dist/components/overlays/Tooltip/context.js +1 -1
  326. package/dist/components/portal/Portal.js +1 -1
  327. package/dist/components/portal/PortalProvider.js +1 -1
  328. package/dist/components/portal/usePortal.js +1 -1
  329. package/dist/components/shared/DraggableCollection.js +1 -1
  330. package/dist/components/shared/InvalidIcon.js +1 -1
  331. package/dist/components/shared/ValidIcon.js +1 -1
  332. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  333. package/dist/components/status/Spin/Cube.js +1 -1
  334. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  335. package/dist/components/status/Spin/Spin.js +1 -1
  336. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  337. package/dist/data/item-themes.js +1 -1
  338. package/dist/data/themes.js +1 -1
  339. package/dist/eslint-plugin/defaults.generated.js +13 -1
  340. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  341. package/dist/eslint-plugin/index.js +1 -1
  342. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  343. package/dist/i18n/I18nProvider.js +1 -1
  344. package/dist/i18n/createFormatter.js +1 -1
  345. package/dist/i18n/index.js +1 -1
  346. package/dist/i18n/instance.js +1 -1
  347. package/dist/i18n/locales/de-DE/uikit.js +5 -1
  348. package/dist/i18n/locales/en-US/uikit.js +5 -1
  349. package/dist/i18n/locales/en-US/uikit.json.d.ts +4 -0
  350. package/dist/i18n/locales/es-ES/uikit.js +5 -1
  351. package/dist/i18n/locales/es-MX/uikit.js +5 -1
  352. package/dist/i18n/locales/fr-FR/uikit.js +5 -1
  353. package/dist/i18n/locales/it-IT/uikit.js +5 -1
  354. package/dist/i18n/locales/ja-JP/uikit.js +5 -1
  355. package/dist/i18n/locales/nb-NO/uikit.js +5 -1
  356. package/dist/i18n/locales/pt-BR/uikit.js +5 -1
  357. package/dist/i18n/locales/pt-PT/uikit.js +5 -1
  358. package/dist/i18n/locales/sv-SE/uikit.js +5 -1
  359. package/dist/i18n/locales/vi-VN/uikit.js +5 -1
  360. package/dist/i18n/locales.js +1 -1
  361. package/dist/i18n/useFormatter.js +1 -1
  362. package/dist/i18n/useI18n.js +1 -1
  363. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  364. package/dist/icons/AdjustmentsIcon.js +1 -1
  365. package/dist/icons/AiIcon.js +1 -1
  366. package/dist/icons/AreaChartIcon.js +1 -1
  367. package/dist/icons/ArrowNarrowDownIcon.d.ts +12 -0
  368. package/dist/icons/ArrowNarrowDownIcon.js +11 -0
  369. package/dist/icons/ArrowNarrowDownIcon.js.map +1 -0
  370. package/dist/icons/ArrowNarrowUpIcon.d.ts +12 -0
  371. package/dist/icons/ArrowNarrowUpIcon.js +11 -0
  372. package/dist/icons/ArrowNarrowUpIcon.js.map +1 -0
  373. package/dist/icons/BackwardIcon.js +1 -1
  374. package/dist/icons/BarChartIcon.js +1 -1
  375. package/dist/icons/BellFilledIcon.js +1 -1
  376. package/dist/icons/BellIcon.js +1 -1
  377. package/dist/icons/BooleanIcon.js +1 -1
  378. package/dist/icons/CalendarEditIcon.js +1 -1
  379. package/dist/icons/CalendarIcon.js +1 -1
  380. package/dist/icons/CaretDownIcon.js +1 -1
  381. package/dist/icons/CaretUpIcon.js +1 -1
  382. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  383. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  384. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  385. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  386. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  387. package/dist/icons/ChartBarLineIcon.js +1 -1
  388. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  389. package/dist/icons/ChartBarStackedIcon.js +1 -1
  390. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  391. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  392. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  393. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  394. package/dist/icons/ChartBubbleIcon.js +1 -1
  395. package/dist/icons/ChartDonut2Icon.js +1 -1
  396. package/dist/icons/ChartFunnelIcon.js +1 -1
  397. package/dist/icons/ChartHeatmapIcon.js +1 -1
  398. package/dist/icons/ChartKPIIcon.js +1 -1
  399. package/dist/icons/ChartPie2Icon.js +1 -1
  400. package/dist/icons/ChartScatterIcon.js +1 -1
  401. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  402. package/dist/icons/CheckCircleIcon.js +1 -1
  403. package/dist/icons/CheckIcon.js +1 -1
  404. package/dist/icons/CircleFilledIcon.js +1 -1
  405. package/dist/icons/ClearIcon.js +1 -1
  406. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  407. package/dist/icons/CloseCircleIcon.js +1 -1
  408. package/dist/icons/CloseIcon.js +1 -1
  409. package/dist/icons/CodeIcon.js +1 -1
  410. package/dist/icons/ColumnTotalIcon.js +1 -1
  411. package/dist/icons/CopyIcon.js +1 -1
  412. package/dist/icons/CountIcon.js +1 -1
  413. package/dist/icons/CubeIcon.js +1 -1
  414. package/dist/icons/CubePauseIcon.js +1 -1
  415. package/dist/icons/CubePlayIcon.js +1 -1
  416. package/dist/icons/CurrencyDollarIcon.js +1 -1
  417. package/dist/icons/DangerIcon.js +1 -1
  418. package/dist/icons/DashboardIcon.js +1 -1
  419. package/dist/icons/DatabaseIcon.js +1 -1
  420. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  421. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  422. package/dist/icons/DirectionIcon.js +1 -1
  423. package/dist/icons/DonutIcon.js +1 -1
  424. package/dist/icons/DownIcon.js +1 -1
  425. package/dist/icons/EditIcon.js +1 -1
  426. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  427. package/dist/icons/ExclamationCircleIcon.js +1 -1
  428. package/dist/icons/ExclamationIcon.js +1 -1
  429. package/dist/icons/EyeIcon.js +1 -1
  430. package/dist/icons/EyeInvisibleIcon.js +1 -1
  431. package/dist/icons/FilterIcon.js +1 -1
  432. package/dist/icons/FolderFilledIcon.js +1 -1
  433. package/dist/icons/FolderIcon.js +1 -1
  434. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  435. package/dist/icons/FolderOpenIcon.js +1 -1
  436. package/dist/icons/ForwardIcon.js +1 -1
  437. package/dist/icons/GripVerticalIcon.js +1 -1
  438. package/dist/icons/HierarchyIcon.js +1 -1
  439. package/dist/icons/HierarchyOpenIcon.js +1 -1
  440. package/dist/icons/Icon.js +1 -1
  441. package/dist/icons/InfoCircleIcon.js +1 -1
  442. package/dist/icons/InfoIcon.js +1 -1
  443. package/dist/icons/KeyIcon.js +1 -1
  444. package/dist/icons/LeftIcon.js +1 -1
  445. package/dist/icons/LineChartIcon.js +1 -1
  446. package/dist/icons/LoadingIcon.js +1 -1
  447. package/dist/icons/LockFilledIcon.js +1 -1
  448. package/dist/icons/LockIcon.js +1 -1
  449. package/dist/icons/MoreIcon.js +1 -1
  450. package/dist/icons/NotAllowedIcon.js +1 -1
  451. package/dist/icons/Number123Icon.js +1 -1
  452. package/dist/icons/NumberIcon.js +1 -1
  453. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  454. package/dist/icons/PauseCircleIcon.js +1 -1
  455. package/dist/icons/PauseIcon.js +1 -1
  456. package/dist/icons/PercentageIcon.js +1 -1
  457. package/dist/icons/PieChartIcon.js +1 -1
  458. package/dist/icons/PipetteIcon.js +1 -1
  459. package/dist/icons/PlayCircleIcon.js +1 -1
  460. package/dist/icons/PlayIcon.js +1 -1
  461. package/dist/icons/PlusIcon.js +1 -1
  462. package/dist/icons/ProgressBarIcon.js +1 -1
  463. package/dist/icons/ReloadIcon.js +1 -1
  464. package/dist/icons/ReportIcon.js +1 -1
  465. package/dist/icons/ReturnIcon.js +1 -1
  466. package/dist/icons/RightIcon.js +1 -1
  467. package/dist/icons/RowTotalsIcon.js +1 -1
  468. package/dist/icons/SchemeIcon.js +1 -1
  469. package/dist/icons/SearchIcon.js +1 -1
  470. package/dist/icons/SemanticQueryIcon.js +1 -1
  471. package/dist/icons/SettingsIcon.js +1 -1
  472. package/dist/icons/ShieldFilledIcon.js +1 -1
  473. package/dist/icons/ShieldIcon.js +1 -1
  474. package/dist/icons/SlashIcon.js +1 -1
  475. package/dist/icons/SparklesIcon.js +1 -1
  476. package/dist/icons/SqlIcon.js +1 -1
  477. package/dist/icons/StatsIcon.js +1 -1
  478. package/dist/icons/StopIcon.js +1 -1
  479. package/dist/icons/StringIcon.js +1 -1
  480. package/dist/icons/SubtotalsIcon.js +1 -1
  481. package/dist/icons/SwitchIcon.js +1 -1
  482. package/dist/icons/TableIcon.js +1 -1
  483. package/dist/icons/ThumbsDownIcon.js +1 -1
  484. package/dist/icons/ThumbsUpIcon.js +1 -1
  485. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  486. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  487. package/dist/icons/ThunderboltIcon.js +1 -1
  488. package/dist/icons/TimeIcon.js +1 -1
  489. package/dist/icons/TrashIcon.js +1 -1
  490. package/dist/icons/UnlockIcon.js +1 -1
  491. package/dist/icons/UpIcon.js +1 -1
  492. package/dist/icons/UserGroupIcon.js +1 -1
  493. package/dist/icons/UserIcon.js +1 -1
  494. package/dist/icons/UserLockIcon.js +1 -1
  495. package/dist/icons/ViewIcon.js +1 -1
  496. package/dist/icons/WarningFilledIcon.js +1 -1
  497. package/dist/icons/WarningIcon.js +1 -1
  498. package/dist/icons/index.d.ts +2 -0
  499. package/dist/icons/wrap-icon.js +1 -1
  500. package/dist/index.d.ts +7 -2
  501. package/dist/index.js +7 -2
  502. package/dist/index.js.map +1 -1
  503. package/dist/provider.js +1 -1
  504. package/dist/providers/TrackingProvider.js +1 -1
  505. package/dist/providers/navigationAdapter.default.js +1 -1
  506. package/dist/tokens/base.js +1 -1
  507. package/dist/tokens/color-theme.d.ts +86 -0
  508. package/dist/tokens/color-theme.js +156 -0
  509. package/dist/tokens/color-theme.js.map +1 -0
  510. package/dist/tokens/colors.js +1 -1
  511. package/dist/tokens/index.d.ts +1 -0
  512. package/dist/tokens/index.js +2 -1
  513. package/dist/tokens/index.js.map +1 -1
  514. package/dist/tokens/layout.js +1 -1
  515. package/dist/tokens/lazy-styles.js +1 -1
  516. package/dist/tokens/palette-config.js +2 -2
  517. package/dist/tokens/palette.d.ts +1 -1
  518. package/dist/tokens/palette.js +44 -2
  519. package/dist/tokens/palette.js.map +1 -1
  520. package/dist/tokens/shadows.js +1 -1
  521. package/dist/tokens/sizes.js +1 -1
  522. package/dist/tokens/spacing.js +1 -1
  523. package/dist/tokens/typography.js +1 -1
  524. package/dist/utils/ResizeSensor.js +1 -1
  525. package/dist/utils/index.d.ts +1 -0
  526. package/dist/utils/is-dev-env.js +1 -1
  527. package/dist/utils/modules.js +1 -1
  528. package/dist/utils/promise.js +1 -1
  529. package/dist/utils/raf.js +1 -1
  530. package/dist/utils/random.js +1 -1
  531. package/dist/utils/range.js +1 -1
  532. package/dist/utils/react/RenderCache.js +1 -1
  533. package/dist/utils/react/Slots.js +1 -1
  534. package/dist/utils/react/chain.js +1 -1
  535. package/dist/utils/react/disabledProps.d.ts +49 -0
  536. package/dist/utils/react/disabledProps.js +82 -0
  537. package/dist/utils/react/disabledProps.js.map +1 -0
  538. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  539. package/dist/utils/react/index.d.ts +1 -0
  540. package/dist/utils/react/index.js +2 -1
  541. package/dist/utils/react/interactions.js +1 -1
  542. package/dist/utils/react/isTextOnly.js +1 -1
  543. package/dist/utils/react/mapProps.js +1 -1
  544. package/dist/utils/react/mergeProps.js +1 -1
  545. package/dist/utils/react/nullableValue.js +1 -1
  546. package/dist/utils/react/resolveIcon.js +1 -1
  547. package/dist/utils/react/sharedStore.js +1 -1
  548. package/dist/utils/react/useBufferedValue.js +1 -1
  549. package/dist/utils/react/useCombinedRefs.js +1 -1
  550. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  551. package/dist/utils/react/useEventBus.js +1 -1
  552. package/dist/utils/react/useId.js +1 -1
  553. package/dist/utils/react/useIsDarwin.js +1 -1
  554. package/dist/utils/react/useKeySymbols.js +1 -1
  555. package/dist/utils/react/useLayoutEffect.js +1 -1
  556. package/dist/utils/react/useLocalStorage.js +1 -1
  557. package/dist/utils/react/useMergeStyles.js +1 -1
  558. package/dist/utils/react/usePopoverSync.js +1 -1
  559. package/dist/utils/react/useQaProps.js +1 -1
  560. package/dist/utils/react/useViewportSize.js +1 -1
  561. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  562. package/dist/utils/selection.js +1 -1
  563. package/dist/utils/styles.js +1 -1
  564. package/dist/utils/tree.js +1 -1
  565. package/dist/utils/warnings.js +1 -1
  566. package/dist/version.js +2 -2
  567. package/docs/components/actions/Button.md +17 -0
  568. package/docs/components/content/Item.md +8 -1
  569. package/docs/components/data/DataTable.md +118 -2
  570. package/docs/components/data/ItemTable.md +37 -5
  571. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { _PrismCode } from "../PrismCode/PrismCode.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { diffLines } from "diff";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeProps } from "../../../utils/react/mergeProps.js";
4
4
  import { wrapNodeIfPlain } from "../../../utils/react/wrapNodeIfPlain.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { Space } from "../../layout/Space.js";
3
3
  import { Grid } from "../../layout/Grid.js";
4
4
  import { Flow } from "../../layout/Flow.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { _Item } from "../Item/Item.js";
3
3
  import { useI18n } from "../../../i18n/useI18n.js";
4
4
  import { CloseIcon } from "../../../icons/CloseIcon.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { BASE_STYLES, COLOR_STYLES, TEXT_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { TEXT_PROP_MAP, _Text } from "../Text.js";
4
4
  import { highlightText } from "../highlightText.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useSlotProps } from "../../utils/react/Slots.js";
4
4
  import { TEXT_PROP_MAP } from "./Text.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { mergeRefs } 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.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { mergeRefs } 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.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { _Item } from "../Item/Item.js";
3
3
  import { Action } from "../../actions/Action/Action.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  //#region src/components/content/Tree/tree-index.ts
3
3
  function buildTreeIndex(treeData) {
4
4
  const byKey = /* @__PURE__ */ new Map();
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { useMemo, useState } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { useRef, useState } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { _Text } from "./Text.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { TooltipProvider } from "../overlays/Tooltip/TooltipProvider.js";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -68,38 +68,46 @@ function useAutoTooltip({ tooltip, children, labelProps, isDynamicLabel = false
68
68
  delete props.ref;
69
69
  return props;
70
70
  }, [labelProps]);
71
- const renderWithTooltip = (renderElement, defaultTooltipPlacement) => {
72
- if (tooltip) {
73
- if (typeof tooltip === "string") return /* @__PURE__ */ jsx(TooltipProvider, {
74
- placement: defaultTooltipPlacement,
75
- title: tooltip,
76
- children: (triggerProps, ref) => renderElement(triggerProps, ref)
77
- });
78
- if (tooltip === true) {
79
- if ((children || labelProps) && (isLabelOverflowed || isDynamicLabel)) return /* @__PURE__ */ jsx(TooltipProvider, {
80
- placement: defaultTooltipPlacement,
81
- title: children,
82
- isDisabled: !isLabelOverflowed && isDynamicLabel,
83
- children: (triggerProps, ref) => renderElement(triggerProps, ref)
84
- });
85
- }
86
- if (typeof tooltip === "object") {
87
- const { auto, ...tooltipProps } = tooltip;
88
- if (tooltipProps.title && auto !== true) return /* @__PURE__ */ jsx(TooltipProvider, {
89
- placement: defaultTooltipPlacement,
90
- ...tooltipProps,
91
- children: (triggerProps, ref) => renderElement(triggerProps, ref)
92
- });
93
- if ((children || labelProps) && (isLabelOverflowed || isDynamicLabel)) return /* @__PURE__ */ jsx(TooltipProvider, {
94
- placement: defaultTooltipPlacement,
95
- title: tooltipProps.title ?? children,
96
- isDisabled: !isLabelOverflowed && isDynamicLabel && tooltipProps.isDisabled !== true,
97
- ...tooltipProps,
98
- children: (triggerProps, ref) => renderElement(triggerProps, ref)
99
- });
100
- }
71
+ /**
72
+ * The `TooltipProvider` props this tooltip resolves to, or `null` when no
73
+ * tooltip is rendered at all. Resolved once so that both the rendering below
74
+ * and `isTooltipActive` speak about the same tooltip.
75
+ */
76
+ const resolvedTooltip = useMemo(() => {
77
+ if (!tooltip) return null;
78
+ if (typeof tooltip === "string") return { title: tooltip };
79
+ const hasAutoContent = !!(children || labelProps) && (isLabelOverflowed || isDynamicLabel);
80
+ if (tooltip === true) {
81
+ if (!hasAutoContent) return null;
82
+ return {
83
+ title: children,
84
+ isDisabled: !isLabelOverflowed && isDynamicLabel
85
+ };
101
86
  }
102
- return renderElement();
87
+ const { auto, ...tooltipProps } = tooltip;
88
+ if (tooltipProps.title && auto !== true) return tooltipProps;
89
+ if (!hasAutoContent) return null;
90
+ return {
91
+ title: tooltipProps.title ?? children,
92
+ isDisabled: !isLabelOverflowed && isDynamicLabel && tooltipProps.isDisabled !== true,
93
+ ...tooltipProps
94
+ };
95
+ }, [
96
+ tooltip,
97
+ children,
98
+ labelProps,
99
+ isLabelOverflowed,
100
+ isDynamicLabel
101
+ ]);
102
+ /** Whether a tooltip is rendered and able to open. */
103
+ const isTooltipActive = !!resolvedTooltip && resolvedTooltip.isDisabled !== true;
104
+ const renderWithTooltip = (renderElement, defaultTooltipPlacement) => {
105
+ if (!resolvedTooltip) return renderElement();
106
+ return /* @__PURE__ */ jsx(TooltipProvider, {
107
+ placement: defaultTooltipPlacement,
108
+ ...resolvedTooltip,
109
+ children: (triggerProps, ref) => renderElement(triggerProps, ref)
110
+ });
103
111
  };
104
112
  return {
105
113
  labelRef: handleLabelElementRef,
@@ -107,6 +115,7 @@ function useAutoTooltip({ tooltip, children, labelProps, isDynamicLabel = false
107
115
  isLabelOverflowed,
108
116
  isAutoTooltipEnabled,
109
117
  hasTooltip: !!tooltip,
118
+ isTooltipActive,
110
119
  renderWithTooltip
111
120
  };
112
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-auto-tooltip.js","names":[],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { OverlayProps } from 'react-aria';\n\nimport {\n CubeTooltipProviderProps,\n TooltipProvider,\n} from '../overlays/Tooltip/TooltipProvider';\n\nimport type { Props } from '../../props';\n\nexport type AutoTooltipValue =\n | string\n | boolean\n | (Omit<CubeTooltipProviderProps, 'children'> & { auto?: boolean });\n\nexport interface UseAutoTooltipOptions {\n tooltip: AutoTooltipValue | undefined;\n children: ReactNode;\n labelProps?: Props;\n isDynamicLabel?: boolean;\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel = false,\n}: UseAutoTooltipOptions) {\n // Determine if auto tooltip is enabled\n // Auto tooltip only works when children is a string (overflow detection needs text)\n const isAutoTooltipEnabled = useMemo(() => {\n if (typeof children !== 'string') return false;\n\n // Boolean true enables auto overflow detection\n if (tooltip === true) return true;\n if (typeof tooltip === 'object') {\n // If title is provided and auto is explicitly true, enable auto overflow detection\n if (tooltip.title) {\n return tooltip.auto === true;\n }\n\n // If no title is provided, default to auto=true unless explicitly disabled\n const autoValue = tooltip.auto !== undefined ? tooltip.auto : true;\n return !!autoValue;\n }\n return false;\n }, [tooltip, children]);\n\n // Track label overflow for auto tooltip (only when enabled)\n const externalLabelRef = (labelProps as any)?.ref;\n const [isLabelOverflowed, setIsLabelOverflowed] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const checkLabelOverflow = useCallback(() => {\n const label = elementRef.current;\n if (!label) {\n setIsLabelOverflowed(false);\n return;\n }\n\n const hasOverflow = label.scrollWidth > label.clientWidth;\n setIsLabelOverflowed(hasOverflow);\n }, []);\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n checkLabelOverflow();\n }\n }, [isAutoTooltipEnabled, checkLabelOverflow]);\n\n // Attach ResizeObserver via callback ref to handle DOM node changes\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Call external callback ref to notify external refs\n if (externalLabelRef) {\n if (typeof externalLabelRef === 'function') {\n externalLabelRef(element);\n } else {\n (externalLabelRef as any).current = element;\n }\n }\n\n // Disconnect previous observer\n if (resizeObserverRef.current) {\n try {\n resizeObserverRef.current.disconnect();\n } catch {\n // do nothing\n }\n resizeObserverRef.current = null;\n }\n\n elementRef.current = element;\n\n if (element && isAutoTooltipEnabled) {\n // Create a fresh observer to capture the latest callback\n const obs = new ResizeObserver(() => {\n checkLabelOverflow();\n });\n resizeObserverRef.current = obs;\n obs.observe(element);\n // Initial check\n checkLabelOverflow();\n } else {\n setIsLabelOverflowed(false);\n }\n },\n [externalLabelRef, isAutoTooltipEnabled, checkLabelOverflow],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (resizeObserverRef.current) {\n try {\n resizeObserverRef.current.disconnect();\n } catch {\n // do nothing\n }\n resizeObserverRef.current = null;\n }\n elementRef.current = null;\n };\n }, []);\n\n const finalLabelProps = useMemo(() => {\n const props = {\n ...(labelProps || {}),\n };\n\n delete props.ref;\n\n return props;\n }, [labelProps]);\n\n const renderWithTooltip = (\n renderElement: (\n tooltipTriggerProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: RefObject<HTMLElement>,\n ) => ReactNode,\n defaultTooltipPlacement: OverlayProps['placement'],\n ) => {\n // Handle tooltip rendering based on tooltip prop type\n if (tooltip) {\n // String tooltip - simple case\n if (typeof tooltip === 'string') {\n return (\n <TooltipProvider placement={defaultTooltipPlacement} title={tooltip}>\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n }\n\n // Boolean tooltip - auto tooltip on overflow\n if (tooltip === true) {\n if ((children || labelProps) && (isLabelOverflowed || isDynamicLabel)) {\n return (\n <TooltipProvider\n placement={defaultTooltipPlacement}\n title={children}\n isDisabled={!isLabelOverflowed && isDynamicLabel}\n >\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n }\n }\n\n // Object tooltip - advanced configuration\n if (typeof tooltip === 'object') {\n const { auto, ...tooltipProps } = tooltip;\n\n // If title is provided and auto is not explicitly true, always show the tooltip\n if (tooltipProps.title && auto !== true) {\n return (\n <TooltipProvider\n placement={defaultTooltipPlacement}\n {...tooltipProps}\n >\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n }\n\n // If title is provided with auto=true, OR no title but auto behavior enabled\n if ((children || labelProps) && (isLabelOverflowed || isDynamicLabel)) {\n return (\n <TooltipProvider\n placement={defaultTooltipPlacement}\n title={tooltipProps.title ?? children}\n isDisabled={\n !isLabelOverflowed &&\n isDynamicLabel &&\n tooltipProps.isDisabled !== true\n }\n {...tooltipProps}\n >\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n }\n }\n }\n\n return renderElement();\n };\n\n return {\n labelRef: handleLabelElementRef,\n labelProps: finalLabelProps,\n isLabelOverflowed,\n isAutoTooltipEnabled,\n hasTooltip: !!tooltip,\n renderWithTooltip,\n };\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,eAAe,EAC7B,SACA,UACA,YACA,iBAAiB,SACO;CAGxB,MAAM,uBAAuB,cAAc;AACzC,MAAI,OAAO,aAAa,SAAU,QAAO;AAGzC,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,OAAO,YAAY,UAAU;AAE/B,OAAI,QAAQ,MACV,QAAO,QAAQ,SAAS;AAK1B,UAAO,CAAC,EADU,QAAQ,SAAS,SAAY,QAAQ,OAAO;;AAGhE,SAAO;IACN,CAAC,SAAS,SAAS,CAAC;CAGvB,MAAM,mBAAoB,YAAoB;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,MAAM;CACjE,MAAM,aAAa,OAA2B,KAAK;CACnD,MAAM,oBAAoB,OAA8B,KAAK;CAE7D,MAAM,qBAAqB,kBAAkB;EAC3C,MAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,OAAO;AACV,wBAAqB,MAAM;AAC3B;;AAIF,uBADoB,MAAM,cAAc,MAAM,YACb;IAChC,EAAE,CAAC;AAEN,iBAAgB;AACd,MAAI,qBACF,qBAAoB;IAErB,CAAC,sBAAsB,mBAAmB,CAAC;CAG9C,MAAM,wBAAwB,aAC3B,YAAgC;AAE/B,MAAI,iBACF,KAAI,OAAO,qBAAqB,WAC9B,kBAAiB,QAAQ;MAEzB,CAAC,iBAAyB,UAAU;AAKxC,MAAI,kBAAkB,SAAS;AAC7B,OAAI;AACF,sBAAkB,QAAQ,YAAY;WAChC;AAGR,qBAAkB,UAAU;;AAG9B,aAAW,UAAU;AAErB,MAAI,WAAW,sBAAsB;GAEnC,MAAM,MAAM,IAAI,qBAAqB;AACnC,wBAAoB;KACpB;AACF,qBAAkB,UAAU;AAC5B,OAAI,QAAQ,QAAQ;AAEpB,uBAAoB;QAEpB,sBAAqB,MAAM;IAG/B;EAAC;EAAkB;EAAsB;EAAmB,CAC7D;AAGD,iBAAgB;AACd,eAAa;AACX,OAAI,kBAAkB,SAAS;AAC7B,QAAI;AACF,uBAAkB,QAAQ,YAAY;YAChC;AAGR,sBAAkB,UAAU;;AAE9B,cAAW,UAAU;;IAEtB,EAAE,CAAC;CAEN,MAAM,kBAAkB,cAAc;EACpC,MAAM,QAAQ,EACZ,GAAI,cAAc,EAAE,EACrB;AAED,SAAO,MAAM;AAEb,SAAO;IACN,CAAC,WAAW,CAAC;CAEhB,MAAM,qBACJ,eAIA,4BACG;AAEH,MAAI,SAAS;AAEX,OAAI,OAAO,YAAY,SACrB,QACE,oBAAC;IAAgB,WAAW;IAAyB,OAAO;eACxD,cAAc,QAAQ,cAAc,cAAc,IAAI;KACxC;AAKtB,OAAI,YAAY,MACd;SAAK,YAAY,gBAAgB,qBAAqB,gBACpD,QACE,oBAAC;KACC,WAAW;KACX,OAAO;KACP,YAAY,CAAC,qBAAqB;gBAEhC,cAAc,QAAQ,cAAc,cAAc,IAAI;MACxC;;AAMxB,OAAI,OAAO,YAAY,UAAU;IAC/B,MAAM,EAAE,MAAM,GAAG,iBAAiB;AAGlC,QAAI,aAAa,SAAS,SAAS,KACjC,QACE,oBAAC;KACC,WAAW;KACX,GAAI;gBAEF,cAAc,QAAQ,cAAc,cAAc,IAAI;MACxC;AAKtB,SAAK,YAAY,gBAAgB,qBAAqB,gBACpD,QACE,oBAAC;KACC,WAAW;KACX,OAAO,aAAa,SAAS;KAC7B,YACE,CAAC,qBACD,kBACA,aAAa,eAAe;KAE9B,GAAI;gBAEF,cAAc,QAAQ,cAAc,cAAc,IAAI;MACxC;;;AAM1B,SAAO,eAAe;;AAGxB,QAAO;EACL,UAAU;EACV,YAAY;EACZ;EACA;EACA,YAAY,CAAC,CAAC;EACd;EACD"}
1
+ {"version":3,"file":"use-auto-tooltip.js","names":[],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { OverlayProps } from 'react-aria';\n\nimport {\n CubeTooltipProviderProps,\n TooltipProvider,\n} from '../overlays/Tooltip/TooltipProvider';\n\nimport type { Props } from '../../props';\n\nexport type AutoTooltipValue =\n | string\n | boolean\n | (Omit<CubeTooltipProviderProps, 'children'> & { auto?: boolean });\n\nexport interface UseAutoTooltipOptions {\n tooltip: AutoTooltipValue | undefined;\n children: ReactNode;\n labelProps?: Props;\n isDynamicLabel?: boolean;\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel = false,\n}: UseAutoTooltipOptions) {\n // Determine if auto tooltip is enabled\n // Auto tooltip only works when children is a string (overflow detection needs text)\n const isAutoTooltipEnabled = useMemo(() => {\n if (typeof children !== 'string') return false;\n\n // Boolean true enables auto overflow detection\n if (tooltip === true) return true;\n if (typeof tooltip === 'object') {\n // If title is provided and auto is explicitly true, enable auto overflow detection\n if (tooltip.title) {\n return tooltip.auto === true;\n }\n\n // If no title is provided, default to auto=true unless explicitly disabled\n const autoValue = tooltip.auto !== undefined ? tooltip.auto : true;\n return !!autoValue;\n }\n return false;\n }, [tooltip, children]);\n\n // Track label overflow for auto tooltip (only when enabled)\n const externalLabelRef = (labelProps as any)?.ref;\n const [isLabelOverflowed, setIsLabelOverflowed] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const checkLabelOverflow = useCallback(() => {\n const label = elementRef.current;\n if (!label) {\n setIsLabelOverflowed(false);\n return;\n }\n\n const hasOverflow = label.scrollWidth > label.clientWidth;\n setIsLabelOverflowed(hasOverflow);\n }, []);\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n checkLabelOverflow();\n }\n }, [isAutoTooltipEnabled, checkLabelOverflow]);\n\n // Attach ResizeObserver via callback ref to handle DOM node changes\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Call external callback ref to notify external refs\n if (externalLabelRef) {\n if (typeof externalLabelRef === 'function') {\n externalLabelRef(element);\n } else {\n (externalLabelRef as any).current = element;\n }\n }\n\n // Disconnect previous observer\n if (resizeObserverRef.current) {\n try {\n resizeObserverRef.current.disconnect();\n } catch {\n // do nothing\n }\n resizeObserverRef.current = null;\n }\n\n elementRef.current = element;\n\n if (element && isAutoTooltipEnabled) {\n // Create a fresh observer to capture the latest callback\n const obs = new ResizeObserver(() => {\n checkLabelOverflow();\n });\n resizeObserverRef.current = obs;\n obs.observe(element);\n // Initial check\n checkLabelOverflow();\n } else {\n setIsLabelOverflowed(false);\n }\n },\n [externalLabelRef, isAutoTooltipEnabled, checkLabelOverflow],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (resizeObserverRef.current) {\n try {\n resizeObserverRef.current.disconnect();\n } catch {\n // do nothing\n }\n resizeObserverRef.current = null;\n }\n elementRef.current = null;\n };\n }, []);\n\n const finalLabelProps = useMemo(() => {\n const props = {\n ...(labelProps || {}),\n };\n\n delete props.ref;\n\n return props;\n }, [labelProps]);\n\n /**\n * The `TooltipProvider` props this tooltip resolves to, or `null` when no\n * tooltip is rendered at all. Resolved once so that both the rendering below\n * and `isTooltipActive` speak about the same tooltip.\n */\n const resolvedTooltip = useMemo<Omit<\n CubeTooltipProviderProps,\n 'children'\n > | null>(() => {\n if (!tooltip) return null;\n\n // String tooltip - simple case\n if (typeof tooltip === 'string') {\n return { title: tooltip };\n }\n\n const hasAutoContent =\n !!(children || labelProps) && (isLabelOverflowed || isDynamicLabel);\n\n // Boolean tooltip - auto tooltip on overflow\n if (tooltip === true) {\n if (!hasAutoContent) return null;\n\n return {\n title: children,\n isDisabled: !isLabelOverflowed && isDynamicLabel,\n };\n }\n\n // Object tooltip - advanced configuration\n const { auto, ...tooltipProps } = tooltip;\n\n // If title is provided and auto is not explicitly true, always show the tooltip\n if (tooltipProps.title && auto !== true) {\n return tooltipProps;\n }\n\n // If title is provided with auto=true, OR no title but auto behavior enabled\n if (!hasAutoContent) return null;\n\n return {\n title: tooltipProps.title ?? children,\n isDisabled:\n !isLabelOverflowed &&\n isDynamicLabel &&\n tooltipProps.isDisabled !== true,\n ...tooltipProps,\n };\n }, [tooltip, children, labelProps, isLabelOverflowed, isDynamicLabel]);\n\n /** Whether a tooltip is rendered and able to open. */\n const isTooltipActive =\n !!resolvedTooltip && resolvedTooltip.isDisabled !== true;\n\n const renderWithTooltip = (\n renderElement: (\n tooltipTriggerProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: RefObject<HTMLElement>,\n ) => ReactNode,\n defaultTooltipPlacement: OverlayProps['placement'],\n ) => {\n if (!resolvedTooltip) return renderElement();\n\n return (\n <TooltipProvider placement={defaultTooltipPlacement} {...resolvedTooltip}>\n {(triggerProps, ref) => renderElement(triggerProps, ref)}\n </TooltipProvider>\n );\n };\n\n return {\n labelRef: handleLabelElementRef,\n labelProps: finalLabelProps,\n isLabelOverflowed,\n isAutoTooltipEnabled,\n hasTooltip: !!tooltip,\n isTooltipActive,\n renderWithTooltip,\n };\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,eAAe,EAC7B,SACA,UACA,YACA,iBAAiB,SACO;CAGxB,MAAM,uBAAuB,cAAc;AACzC,MAAI,OAAO,aAAa,SAAU,QAAO;AAGzC,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,OAAO,YAAY,UAAU;AAE/B,OAAI,QAAQ,MACV,QAAO,QAAQ,SAAS;AAK1B,UAAO,CAAC,EADU,QAAQ,SAAS,SAAY,QAAQ,OAAO;;AAGhE,SAAO;IACN,CAAC,SAAS,SAAS,CAAC;CAGvB,MAAM,mBAAoB,YAAoB;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,MAAM;CACjE,MAAM,aAAa,OAA2B,KAAK;CACnD,MAAM,oBAAoB,OAA8B,KAAK;CAE7D,MAAM,qBAAqB,kBAAkB;EAC3C,MAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,OAAO;AACV,wBAAqB,MAAM;AAC3B;;AAIF,uBADoB,MAAM,cAAc,MAAM,YACb;IAChC,EAAE,CAAC;AAEN,iBAAgB;AACd,MAAI,qBACF,qBAAoB;IAErB,CAAC,sBAAsB,mBAAmB,CAAC;CAG9C,MAAM,wBAAwB,aAC3B,YAAgC;AAE/B,MAAI,iBACF,KAAI,OAAO,qBAAqB,WAC9B,kBAAiB,QAAQ;MAEzB,CAAC,iBAAyB,UAAU;AAKxC,MAAI,kBAAkB,SAAS;AAC7B,OAAI;AACF,sBAAkB,QAAQ,YAAY;WAChC;AAGR,qBAAkB,UAAU;;AAG9B,aAAW,UAAU;AAErB,MAAI,WAAW,sBAAsB;GAEnC,MAAM,MAAM,IAAI,qBAAqB;AACnC,wBAAoB;KACpB;AACF,qBAAkB,UAAU;AAC5B,OAAI,QAAQ,QAAQ;AAEpB,uBAAoB;QAEpB,sBAAqB,MAAM;IAG/B;EAAC;EAAkB;EAAsB;EAAmB,CAC7D;AAGD,iBAAgB;AACd,eAAa;AACX,OAAI,kBAAkB,SAAS;AAC7B,QAAI;AACF,uBAAkB,QAAQ,YAAY;YAChC;AAGR,sBAAkB,UAAU;;AAE9B,cAAW,UAAU;;IAEtB,EAAE,CAAC;CAEN,MAAM,kBAAkB,cAAc;EACpC,MAAM,QAAQ,EACZ,GAAI,cAAc,EAAE,EACrB;AAED,SAAO,MAAM;AAEb,SAAO;IACN,CAAC,WAAW,CAAC;;;;;;CAOhB,MAAM,kBAAkB,cAGR;AACd,MAAI,CAAC,QAAS,QAAO;AAGrB,MAAI,OAAO,YAAY,SACrB,QAAO,EAAE,OAAO,SAAS;EAG3B,MAAM,iBACJ,CAAC,EAAE,YAAY,gBAAgB,qBAAqB;AAGtD,MAAI,YAAY,MAAM;AACpB,OAAI,CAAC,eAAgB,QAAO;AAE5B,UAAO;IACL,OAAO;IACP,YAAY,CAAC,qBAAqB;IACnC;;EAIH,MAAM,EAAE,MAAM,GAAG,iBAAiB;AAGlC,MAAI,aAAa,SAAS,SAAS,KACjC,QAAO;AAIT,MAAI,CAAC,eAAgB,QAAO;AAE5B,SAAO;GACL,OAAO,aAAa,SAAS;GAC7B,YACE,CAAC,qBACD,kBACA,aAAa,eAAe;GAC9B,GAAG;GACJ;IACA;EAAC;EAAS;EAAU;EAAY;EAAmB;EAAe,CAAC;;CAGtE,MAAM,kBACJ,CAAC,CAAC,mBAAmB,gBAAgB,eAAe;CAEtD,MAAM,qBACJ,eAIA,4BACG;AACH,MAAI,CAAC,gBAAiB,QAAO,eAAe;AAE5C,SACE,oBAAC;GAAgB,WAAW;GAAyB,GAAI;cACrD,cAAc,QAAQ,cAAc,cAAc,IAAI;IACxC;;AAItB,QAAO;EACL,UAAU;EACV,YAAY;EACZ;EACA;EACA,YAAY,CAAC,CAAC;EACd;EACA;EACD"}
@@ -1,13 +1,16 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
5
5
  import { useI18n } from "../../../i18n/useI18n.js";
6
+ import { DraggableCollection } from "../../shared/DraggableCollection.js";
6
7
  import { clampPage, getPageInfo } from "../../navigation/Pagination/use-pagination.js";
7
8
  import { ItemTableFooter } from "../ItemTable/ItemTableFooter.js";
9
+ import { RowCollection } from "../TableBase/RowCollection.js";
8
10
  import { selectionRowKey } from "../TableBase/types.js";
9
11
  import { useCellSelection } from "../TableBase/use-cell-selection.js";
10
- import { useTableColumns } from "../TableBase/use-table-columns.js";
12
+ import { getDraggableColumnKeys, isColumnDraggable, useColumnOrder } from "../TableBase/use-column-order.js";
13
+ import { freezeColumnWidths, useTableColumns } from "../TableBase/use-table-columns.js";
11
14
  import { ROW_NUMBER_COLUMN_KEY } from "../TableBase/use-table-selection.js";
12
15
  import { TableView } from "../TableBase/TableView.js";
13
16
  import { useContainerWidth } from "../TableBase/use-container-width.js";
@@ -16,7 +19,9 @@ import { useTableStorage } from "../TableBase/use-table-storage.js";
16
19
  import { CONTAINER_STYLES } from "@tenphi/tasty";
17
20
  import { forwardRef, useMemo, useRef, useState } from "react";
18
21
  import { jsx } from "react/jsx-runtime";
22
+ import { useMultipleSelectionState } from "react-stately";
19
23
  import { useControlledState } from "@react-stately/utils";
24
+ import { SelectionManager } from "@react-stately/selection";
20
25
 
21
26
  //#region src/components/data/DataTable/DataTable.tsx
22
27
  /** Wide enough for five digits at the dense default. */
@@ -42,29 +47,31 @@ function defaultGetRowKey(rowKey) {
42
47
  * Cloud.
43
48
  */
44
49
  function DataTable(props, ref) {
45
- const { data, columns, rowKey = "id", getRowKey, pinnedTopRows, pinnedBottomRows, isLoading = false, loadingIndicator = "overlay", skeletonRowCount, error, emptyLabel, noResultsLabel, isFiltered, shape = "plain", size = "small", rowHeight, headerHeight, isStriped = true, isHeaderHidden, isHeaderSticky, showRowNumbers = false, sortMode, sorts: sortsProp, defaultSorts, onSortsChange, paginationMode = "client", page: pageProp, defaultPage, onPageChange, pageSize: pageSizeProp, defaultPageSize = 100, onPageSizeChange, pageSizeOptions, total: totalProp, totalPages, hasNextPage, summary = true, autoHidePagination = true, footerStart, footerCenter, footerEnd, cellSelectionMode = "range", isCellSelectable, selectedCellRange, defaultSelectedCellRange, onCellRangeChange, isRowMoveAnimated, isResizable = true, columnWidths: columnWidthsProp, defaultColumnWidths, onColumnResize, isVirtualized, virtualizeThreshold, overscan, getRowProps, storageKey, styles, headerStyles, headerCellStyles, bodyStyles, rowStyles, cellStyles, footerStyles, ariaLabel, qa, mods, ...rest } = props;
50
+ const { data, columns, rowKey = "id", getRowKey, pinnedTopRows, pinnedBottomRows, isLoading = false, loadingIndicator = "overlay", skeletonRowCount, error, emptyLabel, noResultsLabel, isFiltered, shape = "plain", size = "small", rowSize, rowHeight, headerHeight, isStriped = true, isHeaderHidden, isHeaderSticky, showRowNumbers = false, sortMode, sorts: sortsProp, defaultSorts, onSortsChange, paginationMode = "client", page: pageProp, defaultPage, onPageChange, pageSize: pageSizeProp, defaultPageSize = 100, onPageSizeChange, pageSizeOptions, total: totalProp, totalPages, hasNextPage, summary = true, autoHidePagination = true, footerStart, footerCenter, footerEnd, cellSelectionMode = "range", isCellSelectable, selectedCellRange, defaultSelectedCellRange, onCellRangeChange, isRowMoveAnimated, isResizable = true, columnWidths: columnWidthsProp, defaultColumnWidths, onColumnResize, isColumnReorderable = false, columnOrder, defaultColumnOrder, onColumnOrderChange, columnContextMenu, onColumnMenuAction, columnMenuTriggerProps, columnMenuProps, isVirtualized, virtualizeThreshold, overscan, getRowProps, storageKey, styles, headerStyles, headerCellStyles, bodyStyles, rowStyles, cellStyles, footerStyles, ariaLabel, qa, mods, ...rest } = props;
46
51
  const rootRef = useCombinedRefs(ref, useRef(null));
47
52
  const [scrollerEl, setScrollerEl] = useState(null);
48
53
  const containerWidth = useContainerWidth(scrollerEl);
49
54
  const storage = useTableStorage(storageKey);
50
- /**
51
- * `dataType` is presentational, so it is folded into the column here rather
52
- * than reaching the renderer: `number` right-aligns and takes tabular figures
53
- * so digits line up down the column.
54
- */
55
- const resolvedColumns = useMemo(() => columns.map((column) => {
56
- const isNumeric = column.dataType === "number";
57
- return {
58
- ...column,
59
- align: column.align ?? (isNumeric ? "end" : "start"),
60
- cellStyles: isNumeric ? {
61
- fontVariantNumeric: "tabular-nums",
62
- ...typeof column.cellStyles === "object" ? column.cellStyles : null
63
- } : column.cellStyles
64
- };
65
- }), [columns]);
66
- const { sorts, sortedRows, toggleSort, mode: resolvedSortMode } = useTableSorts({
67
- columns: resolvedColumns,
55
+ const columnOrderState = useColumnOrder({
56
+ columns: useMemo(() => columns.map((column) => {
57
+ const isNumeric = column.dataType === "number";
58
+ return {
59
+ ...column,
60
+ align: column.align ?? (isNumeric ? "end" : "start"),
61
+ cellStyles: isNumeric ? {
62
+ fontVariantNumeric: "tabular-nums",
63
+ ...typeof column.cellStyles === "object" ? column.cellStyles : null
64
+ } : column.cellStyles
65
+ };
66
+ }), [columns]),
67
+ columnOrder,
68
+ defaultColumnOrder,
69
+ onColumnOrderChange,
70
+ storage
71
+ });
72
+ const orderedColumns = columnOrderState.columns;
73
+ const { sorts, sortedRows, toggleSort, setColumnSort, mode: resolvedSortMode } = useTableSorts({
74
+ columns: orderedColumns,
68
75
  rows: data,
69
76
  mode: sortMode,
70
77
  sorts: sortsProp,
@@ -94,9 +101,15 @@ function DataTable(props, ref) {
94
101
  const draftRef = useRef(null);
95
102
  const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;
96
103
  const columnWidths = draftColumnWidths ?? baseColumnWidths;
104
+ /**
105
+ * The resolved widths, for the freeze below. A ref because `layout` is
106
+ * computed *after* this handler is defined, and `useEvent` only reads it when
107
+ * the drag actually runs.
108
+ */
109
+ const layoutRef = useRef(null);
97
110
  const handleColumnResize = useEvent((key, width) => {
98
111
  draftRef.current = {
99
- ...draftRef.current ?? baseColumnWidths,
112
+ ...draftRef.current ?? freezeColumnWidths(layoutRef.current, baseColumnWidths),
100
113
  [key]: Math.round(width)
101
114
  };
102
115
  setDraftColumnWidths(draftRef.current);
@@ -112,7 +125,7 @@ function DataTable(props, ref) {
112
125
  setDraftColumnWidths(null);
113
126
  });
114
127
  const layout = useTableColumns({
115
- columns: resolvedColumns,
128
+ columns: orderedColumns,
116
129
  containerWidth,
117
130
  columnWidths,
118
131
  leadingColumns: useMemo(() => showRowNumbers ? [{
@@ -120,6 +133,7 @@ function DataTable(props, ref) {
120
133
  width: ROW_NUMBER_WIDTH
121
134
  }] : void 0, [showRowNumbers])
122
135
  });
136
+ layoutRef.current = layout;
123
137
  const { t } = useI18n();
124
138
  const resolvedGetRowKey = useMemo(() => getRowKey ?? defaultGetRowKey(rowKey), [getRowKey, rowKey]);
125
139
  const selectionRows = useMemo(() => [
@@ -169,7 +183,27 @@ function DataTable(props, ref) {
169
183
  const smallestPageSize = pageSizeOptions?.length ? Math.min(...pageSizeOptions) : pageSize;
170
184
  const showPagination = isPaginated && !(autoHidePagination && !hasNextPage && pageInfo.totalPages <= 1 && total <= smallestPageSize);
171
185
  const hasFooter = showPagination || footerStart != null || footerCenter != null || footerEnd != null;
172
- return /* @__PURE__ */ jsx(TableView, {
186
+ const headRowRef = useRef(null);
187
+ const draggableColumnKeys = useMemo(() => getDraggableColumnKeys(layout.columns, isColumnReorderable), [layout.columns, isColumnReorderable]);
188
+ const columnCollection = useMemo(() => new RowCollection(layout.columns.filter((column) => isColumnDraggable(column, isColumnReorderable)), (column) => column.key, /* @__PURE__ */ new Set(), (column) => typeof column.title === "string" ? column.title : column.key), [layout.columns, isColumnReorderable]);
189
+ /**
190
+ * `'single'`, not `'none'`.
191
+ *
192
+ * `useDraggableItem` only deletes its own `onClick` — the one that would
193
+ * hijack a screen-reader click away from the sort — when the selection mode is
194
+ * not `'none'`, and only then does it attach the keyboard drag description.
195
+ * Nothing is ever actually selected here.
196
+ */
197
+ const columnSelectionState = useMultipleSelectionState({
198
+ selectionMode: "single",
199
+ disabledBehavior: "all"
200
+ });
201
+ const columnSelectionManager = useMemo(() => new SelectionManager(columnCollection, columnSelectionState), [columnCollection, columnSelectionState]);
202
+ const handleColumnFocus = useEvent((columnKey) => {
203
+ columnSelectionManager.setFocusedKey(columnKey);
204
+ });
205
+ const isColumnDragEnabled = isColumnReorderable && draggableColumnKeys.length > 1;
206
+ const renderTable = (columnDragState, columnDropState, headCollectionProps) => /* @__PURE__ */ jsx(TableView, {
173
207
  ...rest,
174
208
  rootRef,
175
209
  qa: qa || "DataTable",
@@ -193,6 +227,7 @@ function DataTable(props, ref) {
193
227
  isFiltered,
194
228
  shape,
195
229
  size,
230
+ rowSize,
196
231
  rowHeight,
197
232
  headerHeight,
198
233
  isStriped,
@@ -204,6 +239,11 @@ function DataTable(props, ref) {
204
239
  sortMode: resolvedSortMode,
205
240
  sorts,
206
241
  onColumnSort: toggleSort,
242
+ onColumnSortChange: setColumnSort,
243
+ columnContextMenu,
244
+ onColumnMenuAction,
245
+ columnMenuTriggerProps,
246
+ columnMenuProps,
207
247
  isVirtualized,
208
248
  virtualizeThreshold,
209
249
  overscan,
@@ -219,6 +259,12 @@ function DataTable(props, ref) {
219
259
  rowStyles,
220
260
  cellStyles,
221
261
  mods,
262
+ isColumnReorderable: isColumnDragEnabled,
263
+ columnDragState,
264
+ columnDropState,
265
+ headCollectionProps,
266
+ headRowRef,
267
+ onColumnFocus: handleColumnFocus,
222
268
  footer: hasFooter ? /* @__PURE__ */ jsx(ItemTableFooter, {
223
269
  start: footerStart,
224
270
  center: footerCenter,
@@ -237,6 +283,18 @@ function DataTable(props, ref) {
237
283
  } : void 0
238
284
  }) : null
239
285
  });
286
+ return isColumnDragEnabled ? /* @__PURE__ */ jsx(DraggableCollection, {
287
+ state: {
288
+ collection: columnCollection,
289
+ selectionManager: columnSelectionManager,
290
+ disabledKeys: /* @__PURE__ */ new Set()
291
+ },
292
+ listRef: headRowRef,
293
+ orderedKeys: draggableColumnKeys,
294
+ orientation: "horizontal",
295
+ onReorder: columnOrderState.reorder,
296
+ children: (dragState, dropState, collectionProps) => renderTable(dragState, dropState, collectionProps)
297
+ }) : renderTable();
240
298
  }
241
299
  const _DataTable = forwardRef(DataTable);
242
300
  _DataTable.displayName = "DataTable";
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { clampPage, getPageInfo } from '../../navigation/Pagination';\nimport { ItemTableFooter } from '../ItemTable/ItemTableFooter';\nimport { TableView } from '../TableBase/TableView';\nimport { selectionRowKey } from '../TableBase/types';\nimport { useCellSelection } from '../TableBase/use-cell-selection';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport { useTableColumns } from '../TableBase/use-table-columns';\nimport { ROW_NUMBER_COLUMN_KEY } from '../TableBase/use-table-selection';\nimport { useTableSorts } from '../TableBase/use-table-sorts';\nimport { useTableStorage } from '../TableBase/use-table-storage';\n\nimport type { Key } from '@react-types/shared';\nimport type { ForwardedRef, ReactElement } from 'react';\nimport type { CubeTableRowSection } from '../TableBase/types';\nimport type { CubeDataTableColumn, CubeDataTableProps } from './types';\n\n/** Wide enough for five digits at the dense default. */\nconst ROW_NUMBER_WIDTH = 56;\n\nconst EMPTY_WIDTHS: Record<string, number> = {};\n\nfunction defaultGetRowKey<T>(rowKey: string) {\n return (row: T, index: number): Key => {\n const value = (row as any)?.[rowKey];\n\n return value == null ? index : (value as Key);\n };\n}\n\n/**\n * A grid for query results.\n *\n * The same engine as `ItemTable` — one `TableView`, one column layout, one\n * value pipeline — with the defaults an analytical grid wants rather than a\n * list's: denser type, banded rows, resizable columns, multi-column sort, and\n * rows pinned for totals.\n *\n * It knows nothing about Cube. Measures, dimensions, pivots and drill-downs\n * reach it as ordinary columns, `render` output and `column.header.menu`\n * content, which is what keeps the ~34 kB of Cloud's column-header menu in\n * Cloud.\n */\nfunction DataTable<T = any>(\n props: CubeDataTableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n data,\n columns,\n rowKey = 'id',\n getRowKey,\n pinnedTopRows,\n pinnedBottomRows,\n isLoading = false,\n loadingIndicator = 'overlay',\n skeletonRowCount,\n error,\n emptyLabel,\n noResultsLabel,\n isFiltered,\n shape = 'plain',\n // Denser than `ItemTable`'s `medium`: a result grid is read as a block, and\n // more rows on screen is the point of it.\n size = 'small',\n rowHeight,\n headerHeight,\n isStriped = true,\n isHeaderHidden,\n isHeaderSticky,\n showRowNumbers = false,\n sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n paginationMode = 'client',\n page: pageProp,\n defaultPage,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize = 100,\n onPageSizeChange,\n pageSizeOptions,\n total: totalProp,\n totalPages,\n hasNextPage,\n summary = true,\n autoHidePagination = true,\n footerStart,\n footerCenter,\n footerEnd,\n cellSelectionMode = 'range',\n isCellSelectable,\n selectedCellRange,\n defaultSelectedCellRange,\n onCellRangeChange,\n isRowMoveAnimated,\n isResizable = true,\n columnWidths: columnWidthsProp,\n defaultColumnWidths,\n onColumnResize,\n isVirtualized,\n virtualizeThreshold,\n overscan,\n getRowProps,\n storageKey,\n styles,\n headerStyles,\n headerCellStyles,\n bodyStyles,\n rowStyles,\n cellStyles,\n footerStyles,\n ariaLabel,\n qa,\n mods,\n ...rest\n } = props;\n\n const localRef = useRef<HTMLDivElement>(null);\n const rootRef = useCombinedRefs(ref, localRef);\n const [scrollerEl, setScrollerEl] = useState<HTMLElement | null>(null);\n const containerWidth = useContainerWidth(scrollerEl);\n\n const storage = useTableStorage(storageKey);\n\n /**\n * `dataType` is presentational, so it is folded into the column here rather\n * than reaching the renderer: `number` right-aligns and takes tabular figures\n * so digits line up down the column.\n */\n const resolvedColumns = useMemo(\n () =>\n columns.map((column) => {\n const isNumeric = column.dataType === 'number';\n\n return {\n ...column,\n align: column.align ?? (isNumeric ? 'end' : 'start'),\n cellStyles: isNumeric\n ? {\n fontVariantNumeric: 'tabular-nums',\n ...(typeof column.cellStyles === 'object'\n ? column.cellStyles\n : null),\n }\n : column.cellStyles,\n } as CubeDataTableColumn<T>;\n }),\n [columns],\n );\n\n const {\n sorts,\n sortedRows,\n toggleSort,\n mode: resolvedSortMode,\n } = useTableSorts<T>({\n columns: resolvedColumns,\n rows: data,\n mode: sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n });\n\n const [pageSize, setPageSizeState] = useControlledState<number>(\n pageSizeProp as number,\n (pageSizeProp === undefined && storage.has('pageSize')\n ? storage.initial.pageSize ?? defaultPageSize\n : defaultPageSize) as number,\n onPageSizeChange as (value: number) => void,\n );\n const [page, setPageState] = useControlledState<number>(\n pageProp as number,\n defaultPage ?? 1,\n onPageChange as (value: number) => void,\n );\n\n const isPaginated = paginationMode !== 'off';\n const isServerPaginated = paginationMode === 'server';\n const total = isServerPaginated ? totalProp ?? 0 : sortedRows.length;\n\n const pageInfo = getPageInfo({\n page,\n pageSize,\n total,\n totalPages: isServerPaginated ? totalPages : undefined,\n });\n\n const setPage = useEvent((next: number) =>\n setPageState(clampPage(next, pageInfo.totalPages)),\n );\n const setPageSize = useEvent((next: number) => {\n setPageSizeState(next);\n setPageState(1);\n\n if (pageSizeProp === undefined) storage.write({ pageSize: next });\n });\n\n const visibleRows =\n paginationMode === 'client'\n ? sortedRows.slice(\n (pageInfo.page - 1) * pageSize,\n pageInfo.page * pageSize,\n )\n : sortedRows;\n\n const [ownColumnWidths, setOwnColumnWidths] = useState<\n Record<string, number>\n >(\n () =>\n (columnWidthsProp === undefined && storage.has('columnWidths')\n ? storage.initial.columnWidths ?? defaultColumnWidths\n : defaultColumnWidths) ?? EMPTY_WIDTHS,\n );\n const [draftColumnWidths, setDraftColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n const draftRef = useRef<Record<string, number> | null>(null);\n\n const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;\n const columnWidths = draftColumnWidths ?? baseColumnWidths;\n\n const handleColumnResize = useEvent((key: string, width: number) => {\n draftRef.current = {\n ...(draftRef.current ?? baseColumnWidths),\n [key]: Math.round(width),\n };\n setDraftColumnWidths(draftRef.current);\n });\n\n const handleColumnResizeEnd = useEvent((key: string) => {\n const next = draftRef.current ?? baseColumnWidths;\n\n if (columnWidthsProp === undefined) {\n setOwnColumnWidths(next);\n storage.write({ columnWidths: next });\n }\n\n onColumnResize?.(key, next[key], next);\n draftRef.current = null;\n setDraftColumnWidths(null);\n });\n\n const leadingColumns = useMemo(\n () =>\n showRowNumbers\n ? [{ key: ROW_NUMBER_COLUMN_KEY, width: ROW_NUMBER_WIDTH }]\n : undefined,\n [showRowNumbers],\n );\n\n const layout = useTableColumns<T>({\n columns: resolvedColumns,\n containerWidth,\n columnWidths,\n leadingColumns,\n });\n\n const { t } = useI18n();\n\n const resolvedGetRowKey = useMemo(\n () => getRowKey ?? defaultGetRowKey<T>(rowKey),\n [getRowKey, rowKey],\n );\n\n // Every row a range can reach, in the order they appear on screen. Pinned rows\n // are in it: a total is a figure like any other, and having to copy it\n // separately from the column it sums is the wrong trade.\n //\n // The keys are built here rather than inside the hook so they cannot disagree\n // with the ones the renderer stamps — a pinned row is keyed by its own index\n // within its group, exactly as `renderPinnedRow` keys it.\n const selectionRows = useMemo(\n () => [\n ...(pinnedTopRows ?? []),\n ...visibleRows,\n ...(pinnedBottomRows ?? []),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows],\n );\n const selectionRowKeys = useMemo(\n () => [\n // Section-qualified, matching what the renderer stamps: the same record\n // is routinely pinned at both edges, and one flat key space collapsed the\n // two into whichever came first.\n ...(pinnedTopRows ?? []).map((row, index) =>\n selectionRowKey('pinnedTop', resolvedGetRowKey(row, index)),\n ),\n ...visibleRows.map(resolvedGetRowKey),\n ...(pinnedBottomRows ?? []).map((row, index) =>\n selectionRowKey('pinnedBottom', resolvedGetRowKey(row, index)),\n ),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows, resolvedGetRowKey],\n );\n\n // The hook works in one flat row order; the section a row belongs to is a\n // property of where it sits in that order, so it is resolved here rather than\n // asking the consumer to track it.\n const resolveCellSelectable = useEvent(\n (row: T, rowKey: Key, columnKey: string) => {\n if (!isCellSelectable) return true;\n\n const index = selectionRowKeys.indexOf(rowKey);\n const topCount = pinnedTopRows?.length ?? 0;\n const section: CubeTableRowSection =\n index < topCount\n ? 'pinnedTop'\n : index < topCount + visibleRows.length\n ? 'body'\n : 'pinnedBottom';\n\n return isCellSelectable({ row, rowKey, columnKey, section });\n },\n );\n\n const cellSelection = useCellSelection<T>({\n mode: cellSelectionMode,\n columns: layout.columns,\n rows: selectionRows,\n rowKeys: selectionRowKeys,\n isCellSelectable: isCellSelectable ? resolveCellSelectable : undefined,\n range: selectedCellRange,\n defaultRange: defaultSelectedCellRange,\n onRangeChange: onCellRangeChange,\n });\n\n // Same as `ItemTable`: style props (`height`, `maxHeight`, `margin`, …) land\n // on the root frame. `height` is the one that matters — there is no\n // page-scroll mode, so bounding the grid is what turns the body into a\n // scroller, pins the header, and lets virtualization engage at all.\n const rootStyles = { ...extractStyles(props, CONTAINER_STYLES), ...styles };\n\n const smallestPageSize = pageSizeOptions?.length\n ? Math.min(...pageSizeOptions)\n : pageSize;\n\n const showPagination =\n isPaginated &&\n !(\n autoHidePagination &&\n !hasNextPage &&\n pageInfo.totalPages <= 1 &&\n total <= smallestPageSize\n );\n\n const hasFooter =\n showPagination ||\n footerStart != null ||\n footerCenter != null ||\n footerEnd != null;\n\n return (\n <TableView<T>\n {...rest}\n rootRef={rootRef}\n qa={qa || 'DataTable'}\n rows={visibleRows}\n pinnedTopRows={pinnedTopRows}\n pinnedBottomRows={pinnedBottomRows}\n // Continuous across pages: row 101 is row 101, not row 1 of page two.\n //\n // Server mode counts too — the page and its size are known there just the\n // same, and `rows` is that page. Only `'off'` starts at 1, because then\n // there is no page to be on.\n rowNumberOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n // The same offset drives `aria-rowindex`, which is document-absolute by\n // contract — a screen reader on page 3 should hear \"row 51 of 240\", not\n // \"row 1 of 25\".\n rowIndexOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n totalRowCount={total}\n layout={layout}\n // Always on, unlike `ItemTable`. A result grid is read down a column, and\n // once the values are wide and right-aligned the rule is what keeps a\n // figure attached to its column — which is why Cloud's ag-grid theme sets\n // `columnBorder` for `DataTable` and not for the list grids.\n hasColumnDividers\n cellSelection={cellSelection}\n getRowKey={resolvedGetRowKey}\n onScrollerRef={setScrollerEl}\n isLoading={isLoading}\n loadingIndicator={loadingIndicator}\n skeletonRowCount={skeletonRowCount}\n error={error}\n // Same localized fallbacks as `ItemTable`: a grid that has finished\n // loading and shows an unexplained blank rectangle reads as broken.\n emptyLabel={emptyLabel ?? t('itemTable.noItems', 'No items')}\n noResultsLabel={\n noResultsLabel ?? t('itemTable.noResults', 'No results found')\n }\n isFiltered={isFiltered}\n shape={shape}\n size={size}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n isStriped={isStriped}\n isRowMoveAnimated={isRowMoveAnimated}\n isHeaderHidden={isHeaderHidden}\n isHeaderSticky={isHeaderSticky}\n // The header shows the column name at body size — a result grid has no\n // room for the uppercase caption a list header uses.\n // `t4` throughout: a result grid is read as a block, and one step down\n // from the list preset fits noticeably more on screen without losing\n // legibility. The header takes the medium weight of the same step.\n contentPreset=\"t4\"\n headerPreset=\"t4m\"\n sortMode={resolvedSortMode}\n sorts={sorts}\n onColumnSort={toggleSort}\n isVirtualized={isVirtualized}\n virtualizeThreshold={virtualizeThreshold}\n overscan={overscan}\n isResizable={isResizable}\n onColumnResize={handleColumnResize}\n onColumnResizeEnd={handleColumnResizeEnd}\n getRowProps={getRowProps}\n ariaLabel={ariaLabel}\n styles={rootStyles}\n headerStyles={headerStyles}\n headerCellStyles={headerCellStyles}\n bodyStyles={bodyStyles}\n rowStyles={rowStyles}\n cellStyles={cellStyles}\n mods={mods}\n footer={\n hasFooter ? (\n <ItemTableFooter\n start={footerStart}\n center={footerCenter}\n end={footerEnd}\n styles={footerStyles}\n pagination={\n showPagination\n ? {\n page: pageInfo.page,\n pageSize,\n total,\n totalPages: pageInfo.totalPages,\n pageSizeOptions,\n summary,\n hasNextPage,\n onPageChange: setPage,\n onPageSizeChange: setPageSize,\n }\n : undefined\n }\n />\n ) : null\n }\n />\n );\n}\n\nconst _DataTable = forwardRef(DataTable) as unknown as (<T = any>(\n props: CubeDataTableProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { displayName?: string };\n\n_DataTable.displayName = 'DataTable';\n\nexport { _DataTable as DataTable };\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":["import { SelectionManager } from '@react-stately/selection';\nimport { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\nimport { useMultipleSelectionState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { clampPage, getPageInfo } from '../../navigation/Pagination';\nimport { DraggableCollection } from '../../shared/DraggableCollection';\nimport { ItemTableFooter } from '../ItemTable/ItemTableFooter';\nimport { RowCollection } from '../TableBase/RowCollection';\nimport { TableView } from '../TableBase/TableView';\nimport { selectionRowKey } from '../TableBase/types';\nimport { useCellSelection } from '../TableBase/use-cell-selection';\nimport {\n getDraggableColumnKeys,\n isColumnDraggable,\n useColumnOrder,\n} from '../TableBase/use-column-order';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport {\n freezeColumnWidths,\n useTableColumns,\n} from '../TableBase/use-table-columns';\nimport { ROW_NUMBER_COLUMN_KEY } from '../TableBase/use-table-selection';\nimport { useTableSorts } from '../TableBase/use-table-sorts';\nimport { useTableStorage } from '../TableBase/use-table-storage';\n\nimport type { Key } from '@react-types/shared';\nimport type { ForwardedRef, ReactElement } from 'react';\nimport type {\n CubeTableColumnLayout,\n CubeTableRowSection,\n} from '../TableBase/types';\nimport type { CubeDataTableColumn, CubeDataTableProps } from './types';\n\n/** Wide enough for five digits at the dense default. */\nconst ROW_NUMBER_WIDTH = 56;\n\nconst EMPTY_WIDTHS: Record<string, number> = {};\n\nfunction defaultGetRowKey<T>(rowKey: string) {\n return (row: T, index: number): Key => {\n const value = (row as any)?.[rowKey];\n\n return value == null ? index : (value as Key);\n };\n}\n\n/**\n * A grid for query results.\n *\n * The same engine as `ItemTable` — one `TableView`, one column layout, one\n * value pipeline — with the defaults an analytical grid wants rather than a\n * list's: denser type, banded rows, resizable columns, multi-column sort, and\n * rows pinned for totals.\n *\n * It knows nothing about Cube. Measures, dimensions, pivots and drill-downs\n * reach it as ordinary columns, `render` output and `column.header.menu`\n * content, which is what keeps the ~34 kB of Cloud's column-header menu in\n * Cloud.\n */\nfunction DataTable<T = any>(\n props: CubeDataTableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n data,\n columns,\n rowKey = 'id',\n getRowKey,\n pinnedTopRows,\n pinnedBottomRows,\n isLoading = false,\n loadingIndicator = 'overlay',\n skeletonRowCount,\n error,\n emptyLabel,\n noResultsLabel,\n isFiltered,\n shape = 'plain',\n // Denser than `ItemTable`'s `medium`: a result grid is read as a block, and\n // more rows on screen is the point of it.\n size = 'small',\n rowSize,\n rowHeight,\n headerHeight,\n isStriped = true,\n isHeaderHidden,\n isHeaderSticky,\n showRowNumbers = false,\n sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n paginationMode = 'client',\n page: pageProp,\n defaultPage,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize = 100,\n onPageSizeChange,\n pageSizeOptions,\n total: totalProp,\n totalPages,\n hasNextPage,\n summary = true,\n autoHidePagination = true,\n footerStart,\n footerCenter,\n footerEnd,\n cellSelectionMode = 'range',\n isCellSelectable,\n selectedCellRange,\n defaultSelectedCellRange,\n onCellRangeChange,\n isRowMoveAnimated,\n isResizable = true,\n columnWidths: columnWidthsProp,\n defaultColumnWidths,\n onColumnResize,\n isColumnReorderable = false,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n columnContextMenu,\n onColumnMenuAction,\n columnMenuTriggerProps,\n columnMenuProps,\n isVirtualized,\n virtualizeThreshold,\n overscan,\n getRowProps,\n storageKey,\n styles,\n headerStyles,\n headerCellStyles,\n bodyStyles,\n rowStyles,\n cellStyles,\n footerStyles,\n ariaLabel,\n qa,\n mods,\n ...rest\n } = props;\n\n const localRef = useRef<HTMLDivElement>(null);\n const rootRef = useCombinedRefs(ref, localRef);\n const [scrollerEl, setScrollerEl] = useState<HTMLElement | null>(null);\n const containerWidth = useContainerWidth(scrollerEl);\n\n const storage = useTableStorage(storageKey);\n\n /**\n * `dataType` is presentational, so it is folded into the column here rather\n * than reaching the renderer: `number` right-aligns and takes tabular figures\n * so digits line up down the column.\n */\n const resolvedColumns = useMemo(\n () =>\n columns.map((column) => {\n const isNumeric = column.dataType === 'number';\n\n return {\n ...column,\n align: column.align ?? (isNumeric ? 'end' : 'start'),\n cellStyles: isNumeric\n ? {\n fontVariantNumeric: 'tabular-nums',\n ...(typeof column.cellStyles === 'object'\n ? column.cellStyles\n : null),\n }\n : column.cellStyles,\n } as CubeDataTableColumn<T>;\n }),\n [columns],\n );\n\n // Applied to the SOURCE columns, before `useTableColumns`, so hidden-column\n // filtering, structural injection and pinned hoisting all still happen\n // downstream and `columnOrder` can never fight `pin`.\n const columnOrderState = useColumnOrder<T>({\n columns: resolvedColumns,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n storage,\n });\n const orderedColumns = columnOrderState.columns;\n\n const {\n sorts,\n sortedRows,\n toggleSort,\n setColumnSort,\n mode: resolvedSortMode,\n } = useTableSorts<T>({\n columns: orderedColumns,\n rows: data,\n mode: sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n });\n\n const [pageSize, setPageSizeState] = useControlledState<number>(\n pageSizeProp as number,\n (pageSizeProp === undefined && storage.has('pageSize')\n ? storage.initial.pageSize ?? defaultPageSize\n : defaultPageSize) as number,\n onPageSizeChange as (value: number) => void,\n );\n const [page, setPageState] = useControlledState<number>(\n pageProp as number,\n defaultPage ?? 1,\n onPageChange as (value: number) => void,\n );\n\n const isPaginated = paginationMode !== 'off';\n const isServerPaginated = paginationMode === 'server';\n const total = isServerPaginated ? totalProp ?? 0 : sortedRows.length;\n\n const pageInfo = getPageInfo({\n page,\n pageSize,\n total,\n totalPages: isServerPaginated ? totalPages : undefined,\n });\n\n const setPage = useEvent((next: number) =>\n setPageState(clampPage(next, pageInfo.totalPages)),\n );\n const setPageSize = useEvent((next: number) => {\n setPageSizeState(next);\n setPageState(1);\n\n if (pageSizeProp === undefined) storage.write({ pageSize: next });\n });\n\n const visibleRows =\n paginationMode === 'client'\n ? sortedRows.slice(\n (pageInfo.page - 1) * pageSize,\n pageInfo.page * pageSize,\n )\n : sortedRows;\n\n const [ownColumnWidths, setOwnColumnWidths] = useState<\n Record<string, number>\n >(\n () =>\n (columnWidthsProp === undefined && storage.has('columnWidths')\n ? storage.initial.columnWidths ?? defaultColumnWidths\n : defaultColumnWidths) ?? EMPTY_WIDTHS,\n );\n const [draftColumnWidths, setDraftColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n const draftRef = useRef<Record<string, number> | null>(null);\n\n const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;\n const columnWidths = draftColumnWidths ?? baseColumnWidths;\n\n /**\n * The resolved widths, for the freeze below. A ref because `layout` is\n * computed *after* this handler is defined, and `useEvent` only reads it when\n * the drag actually runs.\n */\n const layoutRef = useRef<CubeTableColumnLayout<T> | null>(null);\n\n const handleColumnResize = useEvent((key: string, width: number) => {\n // First move of a drag freezes every column, so this changes exactly one\n // width instead of re-splitting the flex pool. See `freezeColumnWidths`.\n const base =\n draftRef.current ??\n freezeColumnWidths(layoutRef.current, baseColumnWidths);\n\n draftRef.current = { ...base, [key]: Math.round(width) };\n setDraftColumnWidths(draftRef.current);\n });\n\n const handleColumnResizeEnd = useEvent((key: string) => {\n const next = draftRef.current ?? baseColumnWidths;\n\n if (columnWidthsProp === undefined) {\n setOwnColumnWidths(next);\n storage.write({ columnWidths: next });\n }\n\n onColumnResize?.(key, next[key], next);\n draftRef.current = null;\n setDraftColumnWidths(null);\n });\n\n const leadingColumns = useMemo(\n () =>\n showRowNumbers\n ? [{ key: ROW_NUMBER_COLUMN_KEY, width: ROW_NUMBER_WIDTH }]\n : undefined,\n [showRowNumbers],\n );\n\n const layout = useTableColumns<T>({\n columns: orderedColumns,\n containerWidth,\n columnWidths,\n leadingColumns,\n });\n\n layoutRef.current = layout;\n\n const { t } = useI18n();\n\n const resolvedGetRowKey = useMemo(\n () => getRowKey ?? defaultGetRowKey<T>(rowKey),\n [getRowKey, rowKey],\n );\n\n // Every row a range can reach, in the order they appear on screen. Pinned rows\n // are in it: a total is a figure like any other, and having to copy it\n // separately from the column it sums is the wrong trade.\n //\n // The keys are built here rather than inside the hook so they cannot disagree\n // with the ones the renderer stamps — a pinned row is keyed by its own index\n // within its group, exactly as `renderPinnedRow` keys it.\n const selectionRows = useMemo(\n () => [\n ...(pinnedTopRows ?? []),\n ...visibleRows,\n ...(pinnedBottomRows ?? []),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows],\n );\n const selectionRowKeys = useMemo(\n () => [\n // Section-qualified, matching what the renderer stamps: the same record\n // is routinely pinned at both edges, and one flat key space collapsed the\n // two into whichever came first.\n ...(pinnedTopRows ?? []).map((row, index) =>\n selectionRowKey('pinnedTop', resolvedGetRowKey(row, index)),\n ),\n ...visibleRows.map(resolvedGetRowKey),\n ...(pinnedBottomRows ?? []).map((row, index) =>\n selectionRowKey('pinnedBottom', resolvedGetRowKey(row, index)),\n ),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows, resolvedGetRowKey],\n );\n\n // The hook works in one flat row order; the section a row belongs to is a\n // property of where it sits in that order, so it is resolved here rather than\n // asking the consumer to track it.\n const resolveCellSelectable = useEvent(\n (row: T, rowKey: Key, columnKey: string) => {\n if (!isCellSelectable) return true;\n\n const index = selectionRowKeys.indexOf(rowKey);\n const topCount = pinnedTopRows?.length ?? 0;\n const section: CubeTableRowSection =\n index < topCount\n ? 'pinnedTop'\n : index < topCount + visibleRows.length\n ? 'body'\n : 'pinnedBottom';\n\n return isCellSelectable({ row, rowKey, columnKey, section });\n },\n );\n\n const cellSelection = useCellSelection<T>({\n mode: cellSelectionMode,\n columns: layout.columns,\n rows: selectionRows,\n rowKeys: selectionRowKeys,\n isCellSelectable: isCellSelectable ? resolveCellSelectable : undefined,\n range: selectedCellRange,\n defaultRange: defaultSelectedCellRange,\n onRangeChange: onCellRangeChange,\n });\n\n // Same as `ItemTable`: style props (`height`, `maxHeight`, `margin`, …) land\n // on the root frame. `height` is the one that matters — there is no\n // page-scroll mode, so bounding the grid is what turns the body into a\n // scroller, pins the header, and lets virtualization engage at all.\n const rootStyles = { ...extractStyles(props, CONTAINER_STYLES), ...styles };\n\n const smallestPageSize = pageSizeOptions?.length\n ? Math.min(...pageSizeOptions)\n : pageSize;\n\n const showPagination =\n isPaginated &&\n !(\n autoHidePagination &&\n !hasNextPage &&\n pageInfo.totalPages <= 1 &&\n total <= smallestPageSize\n );\n\n const hasFooter =\n showPagination ||\n footerStart != null ||\n footerCenter != null ||\n footerEnd != null;\n\n /* ── column reordering ────────────────────────────────────────────────── */\n\n const headRowRef = useRef<HTMLTableRowElement>(null);\n const draggableColumnKeys = useMemo(\n () => getDraggableColumnKeys(layout.columns, isColumnReorderable),\n [layout.columns, isColumnReorderable],\n );\n const columnCollection = useMemo(\n () =>\n new RowCollection(\n layout.columns.filter((column) =>\n isColumnDraggable(column, isColumnReorderable),\n ),\n (column) => column.key,\n new Set(),\n // The drag announcements read this — otherwise a screen reader hears\n // \"Insert between and \".\n (column) =>\n typeof column.title === 'string' ? column.title : column.key,\n ),\n [layout.columns, isColumnReorderable],\n );\n /**\n * `'single'`, not `'none'`.\n *\n * `useDraggableItem` only deletes its own `onClick` — the one that would\n * hijack a screen-reader click away from the sort — when the selection mode is\n * not `'none'`, and only then does it attach the keyboard drag description.\n * Nothing is ever actually selected here.\n */\n const columnSelectionState = useMultipleSelectionState({\n selectionMode: 'single',\n disabledBehavior: 'all',\n });\n const columnSelectionManager = useMemo(\n () => new SelectionManager(columnCollection, columnSelectionState),\n [columnCollection, columnSelectionState],\n );\n const handleColumnFocus = useEvent((columnKey: string | null) => {\n columnSelectionManager.setFocusedKey(columnKey);\n });\n\n // One draggable column cannot be reordered, so the machinery stays unmounted\n // and the header keeps its exact DOM.\n const isColumnDragEnabled =\n isColumnReorderable && draggableColumnKeys.length > 1;\n\n const renderTable = (\n columnDragState?: any,\n columnDropState?: any,\n headCollectionProps?: Record<string, any>,\n ) => (\n <TableView<T>\n {...rest}\n rootRef={rootRef}\n qa={qa || 'DataTable'}\n rows={visibleRows}\n pinnedTopRows={pinnedTopRows}\n pinnedBottomRows={pinnedBottomRows}\n // Continuous across pages: row 101 is row 101, not row 1 of page two.\n //\n // Server mode counts too — the page and its size are known there just the\n // same, and `rows` is that page. Only `'off'` starts at 1, because then\n // there is no page to be on.\n rowNumberOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n // The same offset drives `aria-rowindex`, which is document-absolute by\n // contract — a screen reader on page 3 should hear \"row 51 of 240\", not\n // \"row 1 of 25\".\n rowIndexOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n totalRowCount={total}\n layout={layout}\n // Always on, unlike `ItemTable`. A result grid is read down a column, and\n // once the values are wide and right-aligned the rule is what keeps a\n // figure attached to its column — which is why Cloud's ag-grid theme sets\n // `columnBorder` for `DataTable` and not for the list grids.\n hasColumnDividers\n cellSelection={cellSelection}\n getRowKey={resolvedGetRowKey}\n onScrollerRef={setScrollerEl}\n isLoading={isLoading}\n loadingIndicator={loadingIndicator}\n skeletonRowCount={skeletonRowCount}\n error={error}\n // Same localized fallbacks as `ItemTable`: a grid that has finished\n // loading and shows an unexplained blank rectangle reads as broken.\n emptyLabel={emptyLabel ?? t('itemTable.noItems', 'No items')}\n noResultsLabel={\n noResultsLabel ?? t('itemTable.noResults', 'No results found')\n }\n isFiltered={isFiltered}\n shape={shape}\n size={size}\n rowSize={rowSize}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n isStriped={isStriped}\n isRowMoveAnimated={isRowMoveAnimated}\n isHeaderHidden={isHeaderHidden}\n isHeaderSticky={isHeaderSticky}\n // The header shows the column name at body size — a result grid has no\n // room for the uppercase caption a list header uses.\n // `t4` throughout: a result grid is read as a block, and one step down\n // from the list preset fits noticeably more on screen without losing\n // legibility. The header takes the medium weight of the same step.\n contentPreset=\"t4\"\n headerPreset=\"t4m\"\n sortMode={resolvedSortMode}\n sorts={sorts}\n onColumnSort={toggleSort}\n onColumnSortChange={setColumnSort}\n columnContextMenu={columnContextMenu}\n onColumnMenuAction={onColumnMenuAction}\n columnMenuTriggerProps={columnMenuTriggerProps}\n columnMenuProps={columnMenuProps}\n isVirtualized={isVirtualized}\n virtualizeThreshold={virtualizeThreshold}\n overscan={overscan}\n isResizable={isResizable}\n onColumnResize={handleColumnResize}\n onColumnResizeEnd={handleColumnResizeEnd}\n getRowProps={getRowProps}\n ariaLabel={ariaLabel}\n styles={rootStyles}\n headerStyles={headerStyles}\n headerCellStyles={headerCellStyles}\n bodyStyles={bodyStyles}\n rowStyles={rowStyles}\n cellStyles={cellStyles}\n mods={mods}\n isColumnReorderable={isColumnDragEnabled}\n columnDragState={columnDragState}\n columnDropState={columnDropState}\n headCollectionProps={headCollectionProps}\n headRowRef={headRowRef}\n onColumnFocus={handleColumnFocus}\n footer={\n hasFooter ? (\n <ItemTableFooter\n start={footerStart}\n center={footerCenter}\n end={footerEnd}\n styles={footerStyles}\n pagination={\n showPagination\n ? {\n page: pageInfo.page,\n pageSize,\n total,\n totalPages: pageInfo.totalPages,\n pageSizeOptions,\n summary,\n hasNextPage,\n onPageChange: setPage,\n onPageSizeChange: setPageSize,\n }\n : undefined\n }\n />\n ) : null\n }\n />\n );\n\n return isColumnDragEnabled ? (\n <DraggableCollection\n state={{\n collection: columnCollection as any,\n selectionManager: columnSelectionManager as any,\n disabledKeys: new Set(),\n }}\n // The element that DIRECTLY contains the header cells. React Aria's\n // `ListDropTargetDelegate` resolves a drop by measuring `[data-key]`\n // descendants of this element, so pointing it anywhere else leaves every\n // drop unresolvable — the column lifts but never lands.\n listRef={headRowRef}\n orderedKeys={draggableColumnKeys}\n orientation=\"horizontal\"\n onReorder={columnOrderState.reorder}\n >\n {(dragState, dropState, collectionProps) =>\n renderTable(dragState, dropState, collectionProps)\n }\n </DraggableCollection>\n ) : (\n renderTable()\n );\n}\n\nconst _DataTable = forwardRef(DataTable) as unknown as (<T = any>(\n props: CubeDataTableProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { displayName?: string };\n\n_DataTable.displayName = 'DataTable';\n\nexport { _DataTable as DataTable };\n"],"mappings":"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"}