@cube-dev/ui-kit 0.0.0-canary-0b79a39 → 0.0.0-canary-c02e70f

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 (620) hide show
  1. package/dist/CHANGELOG.md +6 -0
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +23 -21
  13. package/dist/components/GlobalStyles.js.map +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/Banner/Banner.js.map +1 -1
  20. package/dist/components/actions/Button/Button.js +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +128 -66
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js.map +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +451 -280
  26. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  27. package/dist/components/actions/CommandMenu/styled.js +1 -1
  28. package/dist/components/actions/ItemAction/ItemAction.js +57 -93
  29. package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
  30. package/dist/components/actions/ItemActionContext.js +1 -1
  31. package/dist/components/actions/ItemActionsWrapper.js +1 -1
  32. package/dist/components/actions/ItemActionsWrapper.js.map +1 -1
  33. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  34. package/dist/components/actions/Link/Link.js +1 -1
  35. package/dist/components/actions/Menu/Menu.js +49 -69
  36. package/dist/components/actions/Menu/Menu.js.map +1 -1
  37. package/dist/components/actions/Menu/MenuItem.js +1 -1
  38. package/dist/components/actions/Menu/MenuSection.js +1 -1
  39. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  40. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  41. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  42. package/dist/components/actions/Menu/context.js +1 -1
  43. package/dist/components/actions/Menu/styled.js +1 -1
  44. package/dist/components/actions/actions-run.js +1 -1
  45. package/dist/components/actions/index.js +1 -1
  46. package/dist/components/actions/use-action.js +1 -1
  47. package/dist/components/actions/use-anchored-menu.js +1 -1
  48. package/dist/components/actions/use-context-menu.js +1 -1
  49. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  50. package/dist/components/content/Alert/Alert.js +1 -1
  51. package/dist/components/content/Alert/use-alert.js +1 -1
  52. package/dist/components/content/Avatar/Avatar.js +1 -1
  53. package/dist/components/content/Badge/Badge.js +1 -1
  54. package/dist/components/content/Card/Card.js +1 -1
  55. package/dist/components/content/Content.js +1 -1
  56. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  57. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  58. package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
  59. package/dist/components/content/Disclosure/Disclosure.js +44 -60
  60. package/dist/components/content/Disclosure/Disclosure.js.map +1 -1
  61. package/dist/components/content/Divider.js +1 -1
  62. package/dist/components/content/Footer.js +1 -1
  63. package/dist/components/content/Header.js +1 -1
  64. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  65. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  66. package/dist/components/content/InlineInput/InlineInput.js +39 -65
  67. package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
  68. package/dist/components/content/Item/Item.js +208 -263
  69. package/dist/components/content/Item/Item.js.map +1 -1
  70. package/dist/components/content/ItemBadge/ItemBadge.js +70 -145
  71. package/dist/components/content/ItemBadge/ItemBadge.js.map +1 -1
  72. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  73. package/dist/components/content/Layout/GridLayout.js +1 -1
  74. package/dist/components/content/Layout/Layout.js +1 -1
  75. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  76. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  77. package/dist/components/content/Layout/LayoutContainer.js +39 -18
  78. package/dist/components/content/Layout/LayoutContainer.js.map +1 -1
  79. package/dist/components/content/Layout/LayoutContent.js +100 -48
  80. package/dist/components/content/Layout/LayoutContent.js.map +1 -1
  81. package/dist/components/content/Layout/LayoutContext.js +211 -95
  82. package/dist/components/content/Layout/LayoutContext.js.map +1 -1
  83. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  84. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  85. package/dist/components/content/Layout/LayoutFooter.js.map +1 -1
  86. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  87. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  88. package/dist/components/content/Layout/LayoutPane.js +240 -123
  89. package/dist/components/content/Layout/LayoutPane.js.map +1 -1
  90. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  91. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  92. package/dist/components/content/Layout/LayoutPanelHeader.js.map +1 -1
  93. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  94. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  95. package/dist/components/content/Layout/hooks/useTinyScrollbar.js.map +1 -1
  96. package/dist/components/content/Layout/index.js +1 -1
  97. package/dist/components/content/Layout/utils.js +1 -1
  98. package/dist/components/content/Paragraph.js +1 -1
  99. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  100. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  101. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  102. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  103. package/dist/components/content/Result/Result.js +28 -48
  104. package/dist/components/content/Result/Result.js.map +1 -1
  105. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  106. package/dist/components/content/Tag/Tag.js +1 -1
  107. package/dist/components/content/Text.js +1 -1
  108. package/dist/components/content/TextItem/TextItem.js +9 -17
  109. package/dist/components/content/TextItem/TextItem.js.map +1 -1
  110. package/dist/components/content/Title.js +1 -1
  111. package/dist/components/content/Tree/Tree.js +1 -1
  112. package/dist/components/content/Tree/TreeNode.js +1 -1
  113. package/dist/components/content/Tree/styled.js +1 -1
  114. package/dist/components/content/Tree/tree-index.js +1 -1
  115. package/dist/components/content/Tree/use-checkbox-tree.js +68 -105
  116. package/dist/components/content/Tree/use-checkbox-tree.js.map +1 -1
  117. package/dist/components/content/Tree/use-load-data.js +1 -1
  118. package/dist/components/content/highlightText.js +1 -1
  119. package/dist/components/content/use-auto-tooltip.js +106 -138
  120. package/dist/components/content/use-auto-tooltip.js.map +1 -1
  121. package/dist/components/data/DataTable/DataTable.js +1 -1
  122. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  123. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  124. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  125. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  126. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  127. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  128. package/dist/components/data/TableBase/RowCollection.js +1 -1
  129. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  130. package/dist/components/data/TableBase/TableRow.js +1 -1
  131. package/dist/components/data/TableBase/TableView.js +1 -1
  132. package/dist/components/data/TableBase/column-menu.js +1 -1
  133. package/dist/components/data/TableBase/column-tint.js +1 -1
  134. package/dist/components/data/TableBase/row-menu.js +1 -1
  135. package/dist/components/data/TableBase/styled.js +1 -1
  136. package/dist/components/data/TableBase/table-tree.js +1 -1
  137. package/dist/components/data/TableBase/types.js +1 -1
  138. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  139. package/dist/components/data/TableBase/use-column-order.js +30 -31
  140. package/dist/components/data/TableBase/use-column-order.js.map +1 -1
  141. package/dist/components/data/TableBase/use-container-width.js +1 -1
  142. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  143. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  144. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  145. package/dist/components/data/TableBase/use-table-search.js +1 -1
  146. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  147. package/dist/components/data/TableBase/use-table-sort.js +38 -42
  148. package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
  149. package/dist/components/data/TableBase/use-table-sorts.js +19 -57
  150. package/dist/components/data/TableBase/use-table-sorts.js.map +1 -1
  151. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  152. package/dist/components/data/TableBase/use-table-tree-state.js +55 -64
  153. package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -1
  154. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  155. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  156. package/dist/components/fields/Checkbox/context.js +1 -1
  157. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  158. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  159. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  160. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  161. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  162. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  163. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  164. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  165. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  166. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  167. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  168. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  169. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  170. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  171. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  172. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  173. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  174. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  175. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  176. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  177. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  178. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  179. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  180. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  181. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  182. package/dist/components/fields/DatePicker/period.js +1 -1
  183. package/dist/components/fields/DatePicker/props.js +1 -1
  184. package/dist/components/fields/DatePicker/utils.js +1 -1
  185. package/dist/components/fields/FileInput/FileInput.js +1 -1
  186. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  187. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  188. package/dist/components/fields/Input/Input.js +1 -1
  189. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  190. package/dist/components/fields/ListBox/ListBox.js +1 -1
  191. package/dist/components/fields/ListBox/optionId.js +1 -1
  192. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  193. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  194. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +32 -38
  195. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js.map +1 -1
  196. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  197. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  198. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  199. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  200. package/dist/components/fields/Picker/Picker.js +1 -1
  201. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  202. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  203. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  204. package/dist/components/fields/RadioGroup/context.js +1 -1
  205. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  206. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  207. package/dist/components/fields/Select/Select.js +1 -1
  208. package/dist/components/fields/Slider/Gradation.js +1 -1
  209. package/dist/components/fields/Slider/HueSlider.js +1 -1
  210. package/dist/components/fields/Slider/HueSlider.js.map +1 -1
  211. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  212. package/dist/components/fields/Slider/Slider.js +1 -1
  213. package/dist/components/fields/Slider/SliderBase.js +1 -1
  214. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  215. package/dist/components/fields/Slider/SliderThumb.js.map +1 -1
  216. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  217. package/dist/components/fields/Slider/SliderTrack.js.map +1 -1
  218. package/dist/components/fields/Slider/elements.js +1 -1
  219. package/dist/components/fields/Slider/index.js +1 -1
  220. package/dist/components/fields/Switch/Switch.js +1 -1
  221. package/dist/components/fields/TagInput/TagInput.js +738 -1139
  222. package/dist/components/fields/TagInput/TagInput.js.map +1 -1
  223. package/dist/components/fields/TagInput/TagList.js +1 -1
  224. package/dist/components/fields/TextArea/TextArea.js +1 -1
  225. package/dist/components/fields/TextInput/TextInput.js +1 -1
  226. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  227. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  228. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  229. package/dist/components/fields/TriggerActions.js +1 -1
  230. package/dist/components/fields/color/ColorPanel.js +1 -1
  231. package/dist/components/fields/color/ColorPanel.js.map +1 -1
  232. package/dist/components/fields/color/channels.js +1 -1
  233. package/dist/components/fields/color/color.js +1 -1
  234. package/dist/components/fields/color/context.js +1 -1
  235. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  236. package/dist/components/form/Form/Field.js +10 -15
  237. package/dist/components/form/Form/Field.js.map +1 -1
  238. package/dist/components/form/Form/Form.js +1 -1
  239. package/dist/components/form/Form/ModernFormRoot.js +1 -1
  240. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  241. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  242. package/dist/components/form/Form/SubmitError.js +1 -1
  243. package/dist/components/form/Form/backend.js +1 -1
  244. package/dist/components/form/Form/index.js +1 -1
  245. package/dist/components/form/Form/modern/actions.js +1 -1
  246. package/dist/components/form/Form/modern/context.js +1 -1
  247. package/dist/components/form/Form/modern/controller.js +1 -1
  248. package/dist/components/form/Form/modern/field-binding.js +1 -1
  249. package/dist/components/form/Form/modern/field.js +1 -1
  250. package/dist/components/form/Form/modern/react.js +1 -1
  251. package/dist/components/form/Form/modern/react.js.map +1 -1
  252. package/dist/components/form/Form/modern/store.js +1 -1
  253. package/dist/components/form/Form/modern/validation.js +1 -1
  254. package/dist/components/form/Form/modern/values.js +1 -1
  255. package/dist/components/form/Form/reset-unbound-controls.js +1 -1
  256. package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
  257. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  258. package/dist/components/form/Form/use-field/use-field.js +1 -1
  259. package/dist/components/form/Form/use-form.js +1 -1
  260. package/dist/components/form/Form/validation.js +1 -1
  261. package/dist/components/form/Label.js +1 -1
  262. package/dist/components/form/legacy-tooltip.js +1 -1
  263. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  264. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  265. package/dist/components/form/validation/use-validation-props.js +1 -1
  266. package/dist/components/form/wrapper.js +1 -1
  267. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  268. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  269. package/dist/components/layout/Board/Board.js +1 -1
  270. package/dist/components/layout/Board/BoardProvider.js +1 -1
  271. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  272. package/dist/components/layout/Board/Widget.js +1 -1
  273. package/dist/components/layout/Board/WidgetHost.js +1 -1
  274. package/dist/components/layout/Board/board-context.js +1 -1
  275. package/dist/components/layout/Board/board-store.js +1 -1
  276. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  277. package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
  278. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  279. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  280. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  281. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  282. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  283. package/dist/components/layout/Board/grid-core/placement.js +1 -1
  284. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  285. package/dist/components/layout/Board/index.js +1 -1
  286. package/dist/components/layout/Board/responsive-utils.js +1 -1
  287. package/dist/components/layout/Board/use-board-layout.js +1 -1
  288. package/dist/components/layout/Board/use-board-registry.js +1 -1
  289. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  290. package/dist/components/layout/Board/use-board-selection.js +1 -1
  291. package/dist/components/layout/Flex.js +1 -1
  292. package/dist/components/layout/Flow.js +1 -1
  293. package/dist/components/layout/Grid.js +1 -1
  294. package/dist/components/layout/Panel.js +129 -48
  295. package/dist/components/layout/Panel.js.map +1 -1
  296. package/dist/components/layout/Prefix.js +1 -1
  297. package/dist/components/layout/ResizablePanel.js +1 -1
  298. package/dist/components/layout/Space.js +1 -1
  299. package/dist/components/layout/Suffix.js +1 -1
  300. package/dist/components/navigation/Pagination/Pagination.js +227 -347
  301. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  302. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  303. package/dist/components/navigation/Pagination/use-pagination.js.map +1 -1
  304. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  305. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  306. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  307. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  308. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  309. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  310. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  311. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  312. package/dist/components/navigation/Tabs/TabsAction.js.map +1 -1
  313. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  314. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  315. package/dist/components/navigation/Tabs/styled.js +1 -1
  316. package/dist/components/navigation/Tabs/types.js +1 -1
  317. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  318. package/dist/components/navigation/Tabs/use-tab-editing.js.map +1 -1
  319. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  320. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  321. package/dist/components/other/Calendar/Calendar.js +1 -1
  322. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  323. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  324. package/dist/components/other/Calendar/CalendarGrid.js.map +1 -1
  325. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  326. package/dist/components/other/Calendar/CalendarPanel.js +497 -515
  327. package/dist/components/other/Calendar/CalendarPanel.js.map +1 -1
  328. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  329. package/dist/components/other/Calendar/PeriodCalendar.js.map +1 -1
  330. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  331. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  332. package/dist/components/other/Calendar/styled.js +1 -1
  333. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  334. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  335. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  336. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  337. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  338. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  339. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  340. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  341. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  342. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  343. package/dist/components/overlays/Dialog/ModernDialogForm.js +1 -1
  344. package/dist/components/overlays/Dialog/context.js +1 -1
  345. package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
  346. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  347. package/dist/components/overlays/Modal/Modal.js +1 -1
  348. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  349. package/dist/components/overlays/Modal/Overlay.js +1 -1
  350. package/dist/components/overlays/Modal/Popover.js +1 -1
  351. package/dist/components/overlays/Modal/Tray.js +1 -1
  352. package/dist/components/overlays/Modal/Underlay.js +1 -1
  353. package/dist/components/overlays/Notifications/Notification.js +1 -1
  354. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  355. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  356. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  357. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  358. package/dist/components/overlays/Notifications/OverlayContainer.js +266 -161
  359. package/dist/components/overlays/Notifications/OverlayContainer.js.map +1 -1
  360. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  361. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  362. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  363. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  364. package/dist/components/overlays/Notifications/index.js +1 -1
  365. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  366. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  367. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  368. package/dist/components/overlays/Notifications/use-persistent-notifications.js +18 -9
  369. package/dist/components/overlays/Notifications/use-persistent-notifications.js.map +1 -1
  370. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  371. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  372. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  373. package/dist/components/overlays/Toast/index.js +1 -1
  374. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  375. package/dist/components/overlays/Toast/useToast.js +1 -1
  376. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  377. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  378. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  379. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  380. package/dist/components/overlays/Tooltip/context.js +1 -1
  381. package/dist/components/overlays/Tooltip/split-trigger-props.js +1 -1
  382. package/dist/components/portal/Portal.js +1 -1
  383. package/dist/components/portal/PortalProvider.js +1 -1
  384. package/dist/components/portal/usePortal.js +1 -1
  385. package/dist/components/shared/DraggableCollection.js +1 -1
  386. package/dist/components/shared/InvalidIcon.js +1 -1
  387. package/dist/components/shared/ValidIcon.js +1 -1
  388. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  389. package/dist/components/status/Spin/Cube.js +1 -1
  390. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  391. package/dist/components/status/Spin/Spin.js +1 -1
  392. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  393. package/dist/data/item-themes.js +1 -1
  394. package/dist/data/themes.js +1 -1
  395. package/dist/eslint-plugin/defaults.generated.js +1 -1
  396. package/dist/eslint-plugin/index.js +1 -1
  397. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  398. package/dist/i18n/I18nProvider.js +1 -1
  399. package/dist/i18n/createFormatter.js +1 -1
  400. package/dist/i18n/index.js +1 -1
  401. package/dist/i18n/instance.js +1 -1
  402. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  403. package/dist/i18n/locales/en-US/uikit.js +1 -1
  404. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  405. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  406. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  407. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  408. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  409. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  410. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  411. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  412. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  413. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  414. package/dist/i18n/locales.js +1 -1
  415. package/dist/i18n/useFormatter.js +1 -1
  416. package/dist/i18n/useFormatter.js.map +1 -1
  417. package/dist/i18n/useI18n.js +1 -1
  418. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  419. package/dist/icons/AdjustmentsIcon.js +1 -1
  420. package/dist/icons/AiIcon.js +1 -1
  421. package/dist/icons/AreaChartIcon.js +1 -1
  422. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  423. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  424. package/dist/icons/BackwardIcon.js +1 -1
  425. package/dist/icons/BarChartIcon.js +1 -1
  426. package/dist/icons/BellFilledIcon.js +1 -1
  427. package/dist/icons/BellIcon.js +1 -1
  428. package/dist/icons/BooleanIcon.js +1 -1
  429. package/dist/icons/CalendarEditIcon.js +1 -1
  430. package/dist/icons/CalendarIcon.js +1 -1
  431. package/dist/icons/CaretDownIcon.js +1 -1
  432. package/dist/icons/CaretUpIcon.js +1 -1
  433. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  434. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  435. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  436. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  437. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  438. package/dist/icons/ChartBarLineIcon.js +1 -1
  439. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  440. package/dist/icons/ChartBarStackedIcon.js +1 -1
  441. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  442. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  443. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  444. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  445. package/dist/icons/ChartBubbleIcon.js +1 -1
  446. package/dist/icons/ChartDonut2Icon.js +1 -1
  447. package/dist/icons/ChartFunnelIcon.js +1 -1
  448. package/dist/icons/ChartHeatmapIcon.js +1 -1
  449. package/dist/icons/ChartKPIIcon.js +1 -1
  450. package/dist/icons/ChartPie2Icon.js +1 -1
  451. package/dist/icons/ChartScatterIcon.js +1 -1
  452. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  453. package/dist/icons/CheckCircleIcon.js +1 -1
  454. package/dist/icons/CheckIcon.js +1 -1
  455. package/dist/icons/CircleFilledIcon.js +1 -1
  456. package/dist/icons/ClearIcon.js +1 -1
  457. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  458. package/dist/icons/CloseCircleIcon.js +1 -1
  459. package/dist/icons/CloseIcon.js +1 -1
  460. package/dist/icons/CodeIcon.js +1 -1
  461. package/dist/icons/ColumnTotalIcon.js +1 -1
  462. package/dist/icons/CopyIcon.js +1 -1
  463. package/dist/icons/CountIcon.js +1 -1
  464. package/dist/icons/CubeIcon.js +1 -1
  465. package/dist/icons/CubePauseIcon.js +1 -1
  466. package/dist/icons/CubePlayIcon.js +1 -1
  467. package/dist/icons/CurrencyDollarIcon.js +1 -1
  468. package/dist/icons/DangerIcon.js +1 -1
  469. package/dist/icons/DashboardIcon.js +1 -1
  470. package/dist/icons/DatabaseIcon.js +1 -1
  471. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  472. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  473. package/dist/icons/DirectionIcon.js +1 -1
  474. package/dist/icons/DonutIcon.js +1 -1
  475. package/dist/icons/DownIcon.js +1 -1
  476. package/dist/icons/EditIcon.js +1 -1
  477. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  478. package/dist/icons/ExclamationCircleIcon.js +1 -1
  479. package/dist/icons/ExclamationIcon.js +1 -1
  480. package/dist/icons/EyeIcon.js +1 -1
  481. package/dist/icons/EyeInvisibleIcon.js +1 -1
  482. package/dist/icons/FilterIcon.js +1 -1
  483. package/dist/icons/FolderFilledIcon.js +1 -1
  484. package/dist/icons/FolderIcon.js +1 -1
  485. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  486. package/dist/icons/FolderOpenIcon.js +1 -1
  487. package/dist/icons/ForwardIcon.js +1 -1
  488. package/dist/icons/GripVerticalIcon.js +1 -1
  489. package/dist/icons/HierarchyIcon.js +1 -1
  490. package/dist/icons/HierarchyOpenIcon.js +1 -1
  491. package/dist/icons/Icon.js +1 -1
  492. package/dist/icons/InfoCircleIcon.js +1 -1
  493. package/dist/icons/InfoIcon.js +1 -1
  494. package/dist/icons/KeyIcon.js +1 -1
  495. package/dist/icons/LeftIcon.js +1 -1
  496. package/dist/icons/LineChartIcon.js +1 -1
  497. package/dist/icons/LoadingIcon.js +1 -1
  498. package/dist/icons/LockFilledIcon.js +1 -1
  499. package/dist/icons/LockIcon.js +1 -1
  500. package/dist/icons/MoreIcon.js +1 -1
  501. package/dist/icons/NotAllowedIcon.js +1 -1
  502. package/dist/icons/Number123Icon.js +1 -1
  503. package/dist/icons/NumberIcon.js +1 -1
  504. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  505. package/dist/icons/PauseCircleIcon.js +1 -1
  506. package/dist/icons/PauseIcon.js +1 -1
  507. package/dist/icons/PercentageIcon.js +1 -1
  508. package/dist/icons/PieChartIcon.js +1 -1
  509. package/dist/icons/PipetteIcon.js +1 -1
  510. package/dist/icons/PlayCircleIcon.js +1 -1
  511. package/dist/icons/PlayIcon.js +1 -1
  512. package/dist/icons/PlusIcon.js +1 -1
  513. package/dist/icons/ProgressBarIcon.js +1 -1
  514. package/dist/icons/ReloadIcon.js +1 -1
  515. package/dist/icons/ReportIcon.js +1 -1
  516. package/dist/icons/ReturnIcon.js +1 -1
  517. package/dist/icons/RightIcon.js +1 -1
  518. package/dist/icons/RowTotalsIcon.js +1 -1
  519. package/dist/icons/SchemeIcon.js +1 -1
  520. package/dist/icons/SearchIcon.js +1 -1
  521. package/dist/icons/SemanticQueryIcon.js +1 -1
  522. package/dist/icons/SettingsIcon.js +1 -1
  523. package/dist/icons/ShieldFilledIcon.js +1 -1
  524. package/dist/icons/ShieldIcon.js +1 -1
  525. package/dist/icons/SlashIcon.js +1 -1
  526. package/dist/icons/SparklesIcon.js +1 -1
  527. package/dist/icons/SqlIcon.js +1 -1
  528. package/dist/icons/StatsIcon.js +1 -1
  529. package/dist/icons/StopIcon.js +1 -1
  530. package/dist/icons/StringIcon.js +1 -1
  531. package/dist/icons/SubtotalsIcon.js +1 -1
  532. package/dist/icons/SwitchIcon.js +1 -1
  533. package/dist/icons/TableIcon.js +1 -1
  534. package/dist/icons/ThumbsDownIcon.js +1 -1
  535. package/dist/icons/ThumbsUpIcon.js +1 -1
  536. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  537. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  538. package/dist/icons/ThunderboltIcon.js +1 -1
  539. package/dist/icons/TimeIcon.js +1 -1
  540. package/dist/icons/TrashIcon.js +1 -1
  541. package/dist/icons/UnlockIcon.js +1 -1
  542. package/dist/icons/UpIcon.js +1 -1
  543. package/dist/icons/UserGroupIcon.js +1 -1
  544. package/dist/icons/UserIcon.js +1 -1
  545. package/dist/icons/UserLockIcon.js +1 -1
  546. package/dist/icons/ViewIcon.js +1 -1
  547. package/dist/icons/WarningFilledIcon.js +1 -1
  548. package/dist/icons/WarningIcon.js +1 -1
  549. package/dist/icons/wrap-icon.js +1 -1
  550. package/dist/index.js +1 -1
  551. package/dist/probe/canonicalize.js +1 -1
  552. package/dist/probe/css.js +1 -1
  553. package/dist/probe/index.js +1 -1
  554. package/dist/provider.js +1 -1
  555. package/dist/providers/TrackingProvider.js +1 -1
  556. package/dist/providers/navigationAdapter.default.js +1 -1
  557. package/dist/tokens/all-tokens.js +1 -1
  558. package/dist/tokens/base.js +1 -1
  559. package/dist/tokens/color-seed.js +1 -1
  560. package/dist/tokens/color-theme.js +1 -1
  561. package/dist/tokens/colors.js +1 -1
  562. package/dist/tokens/layout.js +1 -1
  563. package/dist/tokens/lazy-styles.js +1 -1
  564. package/dist/tokens/legacy-color.js +1 -1
  565. package/dist/tokens/palette-config.js +1 -1
  566. package/dist/tokens/palette.js +1 -1
  567. package/dist/tokens/resolve.js +1 -1
  568. package/dist/tokens/shadows.js +1 -1
  569. package/dist/tokens/sizes.js +1 -1
  570. package/dist/tokens/spacing.js +1 -1
  571. package/dist/tokens/typography.js +1 -1
  572. package/dist/utils/ResizeSensor.js +1 -1
  573. package/dist/utils/colors.js +1 -1
  574. package/dist/utils/dotize.js +1 -1
  575. package/dist/utils/is-dev-env.js +1 -1
  576. package/dist/utils/modules.js +1 -1
  577. package/dist/utils/promise.js +1 -1
  578. package/dist/utils/raf.js +1 -1
  579. package/dist/utils/random.js +1 -1
  580. package/dist/utils/range.js +1 -1
  581. package/dist/utils/react/RenderCache.js +1 -1
  582. package/dist/utils/react/Slots.js +1 -1
  583. package/dist/utils/react/chain.js +1 -1
  584. package/dist/utils/react/disabledProps.js +1 -1
  585. package/dist/utils/react/escapePropagation.js +1 -1
  586. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  587. package/dist/utils/react/index.js +1 -1
  588. package/dist/utils/react/interactions.js +1 -1
  589. package/dist/utils/react/isTextOnly.js +1 -1
  590. package/dist/utils/react/mapProps.js +1 -1
  591. package/dist/utils/react/mergeProps.js +1 -1
  592. package/dist/utils/react/nullableValue.js +1 -1
  593. package/dist/utils/react/programmaticFocus.js +1 -1
  594. package/dist/utils/react/resolveIcon.js +1 -1
  595. package/dist/utils/react/sharedStore.js +1 -1
  596. package/dist/utils/react/useBufferedValue.js +1 -1
  597. package/dist/utils/react/useCombinedRefs.js +1 -1
  598. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  599. package/dist/utils/react/useEventBus.js +1 -1
  600. package/dist/utils/react/useId.js +1 -1
  601. package/dist/utils/react/useIsDarwin.js +1 -1
  602. package/dist/utils/react/useKeySymbols.js +1 -1
  603. package/dist/utils/react/useKeySymbols.js.map +1 -1
  604. package/dist/utils/react/useLayoutEffect.js +1 -1
  605. package/dist/utils/react/useLocalStorage.js +1 -1
  606. package/dist/utils/react/useMergeStyles.js +1 -1
  607. package/dist/utils/react/useOverlayEscapeGuard.js +1 -1
  608. package/dist/utils/react/usePopoverSync.js +1 -1
  609. package/dist/utils/react/usePopoverSync.js.map +1 -1
  610. package/dist/utils/react/useQaProps.js +1 -1
  611. package/dist/utils/react/useScheme.js +1 -1
  612. package/dist/utils/react/useViewportSize.js +1 -1
  613. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  614. package/dist/utils/selection.js +1 -1
  615. package/dist/utils/styles.js +1 -1
  616. package/dist/utils/tree.js +1 -1
  617. package/dist/utils/warnings.js +1 -1
  618. package/dist/version.js +2 -2
  619. package/docs/CreateComponent.md +3 -1
  620. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"use-auto-tooltip.js","names":["HTMLAttributes","ReactNode","Ref","RefObject","useCallback","useEffect","useMemo","useRef","useState","OverlayProps","flushSync","CubeTooltipProviderProps","TooltipProvider","Props","AutoTooltipValue","Omit","auto","UseAutoTooltipOptions","tooltip","children","labelProps","isDynamicLabel","labelRef","HTMLElement","assignRef","ref","element","current","pendingOverflowChecks","Set","runOverflowChecks","checks","Array","from","clear","check","queueOverflowCheck","size","queueMicrotask","add","useAutoTooltip","t0","$","_c","t1","labelRefOption","undefined","t2","bb0","title","autoValue","isAutoTooltipEnabled","externalLabelRef","isLabelOverflowed","setIsLabelOverflowed","elementRef","resizeObserverRef","verdictRef","t3","Symbol","for","value","setVerdict","t4","label","scrollWidth","clientWidth","checkLabelOverflow","t5","scheduleLabelOverflowCheck","t6","t7","t8","disconnect","obs","ResizeObserver","observe","handleLabelElementRef","t9","props","finalLabelProps","t10","bb1","t11","hasAutoContent","t12","isDisabled","tooltipProps","t13","resolvedTooltip","isTooltipActive","renderElement","defaultTooltipPlacement","triggerProps","renderWithTooltip","hasTooltip"],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { OverlayProps } from 'react-aria';\nimport { flushSync } from 'react-dom';\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 * The caller's own ref to the label element. The hook owns the label's ref\n * (it measures the node), so a caller that also needs the node hands its ref\n * over here rather than attaching a second one.\n */\n labelRef?: Ref<HTMLElement>;\n}\n\nfunction assignRef(ref: unknown, element: HTMLElement | null) {\n if (typeof ref === 'function') {\n ref(element);\n } else if (ref) {\n (ref as { current: HTMLElement | null }).current = element;\n }\n}\n\n/** Overflow checks queued for the end of the current task, from every label. */\nconst pendingOverflowChecks = new Set<() => void>();\n\n/**\n * Runs every queued check in one pass and commits the verdicts that changed in\n * one synchronous render.\n *\n * All reads happen before React touches the DOM again, so they share one\n * layout. `flushSync` applies the verdicts, and the `TooltipProvider` remounts\n * they cause, before paint and before any other task, so code that looks the\n * label up after this task gets the node the verdict leaves in place, not one\n * about to be replaced. Outside a React commit this is an ordinary sync\n * render, not a nested update.\n */\nfunction runOverflowChecks() {\n const checks = Array.from(pendingOverflowChecks);\n\n pendingOverflowChecks.clear();\n\n flushSync(() => {\n for (const check of checks) check();\n });\n}\n\nfunction queueOverflowCheck(check: () => void) {\n if (!pendingOverflowChecks.size) queueMicrotask(runOverflowChecks);\n\n pendingOverflowChecks.add(check);\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel = false,\n labelRef: labelRefOption,\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 verdictRef = useRef(false);\n\n /**\n * Sets the verdict only when it changes. React skips an unchanged `setState`\n * only while the component has no other update queued; otherwise the no-op is\n * enqueued like any other update. From an effect flushed inside a sync commit\n * that is a pending update, and a nested one — see the mount effect below.\n * Mirroring the verdict makes every unchanged write free, whatever else the\n * component has queued.\n */\n const setVerdict = useCallback((value: boolean) => {\n if (verdictRef.current === value) return;\n\n verdictRef.current = value;\n setIsLabelOverflowed(value);\n }, []);\n\n const checkLabelOverflow = useCallback(() => {\n const label = elementRef.current;\n\n if (!label) return;\n\n setVerdict(label.scrollWidth > label.clientWidth);\n }, [setVerdict]);\n\n /**\n * Measure once the current task has finished, not inside it.\n *\n * A microtask runs after React's whole commit — every mutation, layout effect\n * and ref attachment — and before paint. Every label on the page therefore\n * reads after all of them have written, so the reads collapse into one style\n * and layout flush instead of forcing one each, mid-commit. Reading straight\n * from the callback ref is what cost 122ms of `get scrollWidth` in one Cloud\n * profile, more than the entire style engine.\n *\n * A microtask rather than the observer's first delivery: observer callbacks\n * are part of the rendering steps, so a runner that is not producing frames —\n * a background tab, or a headless browser running many stories at once — can\n * delay them past the point something asks whether the tooltip is active.\n * Microtasks do not depend on a frame. See `runOverflowChecks` for how the\n * verdicts are applied.\n */\n const scheduleLabelOverflowCheck = useCallback(() => {\n queueOverflowCheck(checkLabelOverflow);\n }, [checkLabelOverflow]);\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n // Queued, not measured here. React 19 flushes a sync commit's passive\n // effects before the commit returns, so a verdict set from this effect\n // leaves that commit with an update pending — a nested update. A list\n // that commits each row on its own (ag-grid-react wraps every new row in\n // `flushSync`) then gains one per row, and React throws \"Maximum update\n // depth exceeded\" once the count passes 50. The queued check runs after\n // the commit and still before paint. The callback ref has usually queued\n // it already, so this call is absorbed. It matters when the flag flips on\n // for a label whose ref did not re-attach.\n scheduleLabelOverflowCheck();\n\n return;\n }\n\n // Clearing here rather than in the callback ref, which cannot be trusted\n // to do it. Flipping `isAutoTooltipEnabled` changes the ref's identity, so\n // React detaches with the PREVIOUS callback — the one that still believes\n // auto tooltips are on, and therefore keeps the last verdict — and only\n // attaches the new one if the label still exists. When `children` stops\n // being a string the label unmounts, so the new callback never runs and a\n // stale `true` would keep an auto tooltip mounted over content that is no\n // longer text. That is the default `Button` path, where `tooltip` is `true`.\n setVerdict(false);\n }, [isAutoTooltipEnabled, scheduleLabelOverflowCheck, setVerdict]);\n\n // Attach ResizeObserver via callback ref to handle DOM node changes. The ref\n // also owns teardown: React hands it `null` when the label goes away. An\n // unmount effect must not repeat that. React 18 Strict Mode replays effects\n // without re-attaching refs, so the replay would drop the node and observer\n // for good and strand the queued check.\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Notify the external refs\n assignRef(externalLabelRef, element);\n assignRef(labelRefOption, element);\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 (!isAutoTooltipEnabled) {\n setVerdict(false);\n\n return;\n }\n\n // No node to measure. Leave the previous verdict alone rather than\n // clearing it: turning the verdict on mounts `TooltipProvider`, which\n // remounts the label underneath it, so React detaches the old node and\n // attaches a new one within that commit. Clearing here would unmount the\n // provider, remount the label, measure it, mount the provider again — a\n // loop that never settles.\n if (!element) return;\n\n // Do NOT measure synchronously here — see `scheduleLabelOverflowCheck`.\n // This covers the node the ref just handed us, including the fresh one\n // React creates when `TooltipProvider` mounts and remounts the label.\n scheduleLabelOverflowCheck();\n\n // The observer covers every later size change.\n const obs = new ResizeObserver(() => {\n checkLabelOverflow();\n });\n\n resizeObserverRef.current = obs;\n\n obs.observe(element);\n },\n [\n externalLabelRef,\n labelRefOption,\n isAutoTooltipEnabled,\n checkLabelOverflow,\n scheduleLabelOverflowCheck,\n setVerdict,\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":"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"}
1
+ {"version":3,"file":"use-auto-tooltip.js","names":["HTMLAttributes","ReactNode","Ref","RefObject","useCallback","useEffect","useRef","useState","OverlayProps","flushSync","CubeTooltipProviderProps","TooltipProvider","Props","AutoTooltipValue","Omit","auto","UseAutoTooltipOptions","tooltip","children","labelProps","isDynamicLabel","labelRef","HTMLElement","assignRef","ref","element","current","pendingOverflowChecks","Set","runOverflowChecks","checks","Array","from","clear","check","queueOverflowCheck","size","queueMicrotask","add","isAutoTooltip","title","undefined","resolveTooltip","isLabelOverflowed","hasAutoContent","isDisabled","tooltipProps","useAutoTooltip","t0","$","_c","t1","labelRefOption","t2","isAutoTooltipEnabled","externalLabelRef","setIsLabelOverflowed","elementRef","resizeObserverRef","verdictRef","t3","Symbol","for","value","setVerdict","t4","label","scrollWidth","clientWidth","checkLabelOverflow","t5","scheduleLabelOverflowCheck","t6","t7","t8","disconnect","obs","ResizeObserver","observe","handleLabelElementRef","t9","finalLabelProps","_labelPropsRef","t10","resolvedTooltip","isTooltipActive","t11","renderElement","defaultTooltipPlacement","triggerProps","renderWithTooltip","t12","t13","hasTooltip"],"sources":["../../../src/components/content/use-auto-tooltip.tsx"],"sourcesContent":["import {\n HTMLAttributes,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { OverlayProps } from 'react-aria';\nimport { flushSync } from 'react-dom';\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 * The caller's own ref to the label element. The hook owns the label's ref\n * (it measures the node), so a caller that also needs the node hands its ref\n * over here rather than attaching a second one.\n */\n labelRef?: Ref<HTMLElement>;\n}\n\nfunction assignRef(ref: unknown, element: HTMLElement | null) {\n if (typeof ref === 'function') {\n ref(element);\n } else if (ref) {\n (ref as { current: HTMLElement | null }).current = element;\n }\n}\n\n/** Overflow checks queued for the end of the current task, from every label. */\nconst pendingOverflowChecks = new Set<() => void>();\n\n/**\n * Runs every queued check in one pass and commits the verdicts that changed in\n * one synchronous render.\n *\n * All reads happen before React touches the DOM again, so they share one\n * layout. `flushSync` applies the verdicts, and the `TooltipProvider` remounts\n * they cause, before paint and before any other task, so code that looks the\n * label up after this task gets the node the verdict leaves in place, not one\n * about to be replaced. Outside a React commit this is an ordinary sync\n * render, not a nested update.\n */\nfunction runOverflowChecks() {\n const checks = Array.from(pendingOverflowChecks);\n\n pendingOverflowChecks.clear();\n\n flushSync(() => {\n for (const check of checks) check();\n });\n}\n\nfunction queueOverflowCheck(check: () => void) {\n if (!pendingOverflowChecks.size) queueMicrotask(runOverflowChecks);\n\n pendingOverflowChecks.add(check);\n}\n\n/**\n * Whether the tooltip detects label overflow on its own. Overflow detection\n * measures text, so it needs a string label.\n */\nfunction isAutoTooltip(\n tooltip: AutoTooltipValue | undefined,\n children: ReactNode,\n): boolean {\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 return tooltip.auto !== undefined ? !!tooltip.auto : true;\n }\n return false;\n}\n\n/**\n * The `TooltipProvider` props a tooltip resolves to, or `null` when no tooltip\n * is rendered at all.\n */\nfunction resolveTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel,\n isLabelOverflowed,\n}: Omit<UseAutoTooltipOptions, 'labelRef'> & {\n isLabelOverflowed: boolean;\n}): Omit<CubeTooltipProviderProps, 'children'> | 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 && isDynamicLabel && tooltipProps.isDisabled !== true,\n ...tooltipProps,\n };\n}\n\nexport function useAutoTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel = false,\n labelRef: labelRefOption,\n}: UseAutoTooltipOptions) {\n const isAutoTooltipEnabled = isAutoTooltip(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 verdictRef = useRef(false);\n\n /**\n * Sets the verdict only when it changes. React skips an unchanged `setState`\n * only while the component has no other update queued; otherwise the no-op is\n * enqueued like any other update. From an effect flushed inside a sync commit\n * that is a pending update, and a nested one — see the mount effect below.\n * Mirroring the verdict makes every unchanged write free, whatever else the\n * component has queued.\n */\n const setVerdict = useCallback((value: boolean) => {\n if (verdictRef.current === value) return;\n\n verdictRef.current = value;\n setIsLabelOverflowed(value);\n }, []);\n\n const checkLabelOverflow = useCallback(() => {\n const label = elementRef.current;\n\n if (!label) return;\n\n setVerdict(label.scrollWidth > label.clientWidth);\n }, [setVerdict]);\n\n /**\n * Measure once the current task has finished, not inside it.\n *\n * A microtask runs after React's whole commit — every mutation, layout effect\n * and ref attachment — and before paint. Every label on the page therefore\n * reads after all of them have written, so the reads collapse into one style\n * and layout flush instead of forcing one each, mid-commit. Reading straight\n * from the callback ref is what cost 122ms of `get scrollWidth` in one Cloud\n * profile, more than the entire style engine.\n *\n * A microtask rather than the observer's first delivery: observer callbacks\n * are part of the rendering steps, so a runner that is not producing frames —\n * a background tab, or a headless browser running many stories at once — can\n * delay them past the point something asks whether the tooltip is active.\n * Microtasks do not depend on a frame. See `runOverflowChecks` for how the\n * verdicts are applied.\n */\n const scheduleLabelOverflowCheck = useCallback(() => {\n queueOverflowCheck(checkLabelOverflow);\n }, [checkLabelOverflow]);\n\n useEffect(() => {\n if (isAutoTooltipEnabled) {\n // Queued, not measured here. React 19 flushes a sync commit's passive\n // effects before the commit returns, so a verdict set from this effect\n // leaves that commit with an update pending — a nested update. A list\n // that commits each row on its own (ag-grid-react wraps every new row in\n // `flushSync`) then gains one per row, and React throws \"Maximum update\n // depth exceeded\" once the count passes 50. The queued check runs after\n // the commit and still before paint. The callback ref has usually queued\n // it already, so this call is absorbed. It matters when the flag flips on\n // for a label whose ref did not re-attach.\n scheduleLabelOverflowCheck();\n\n return;\n }\n\n // Clearing here rather than in the callback ref, which cannot be trusted\n // to do it. Flipping `isAutoTooltipEnabled` changes the ref's identity, so\n // React detaches with the PREVIOUS callback — the one that still believes\n // auto tooltips are on, and therefore keeps the last verdict — and only\n // attaches the new one if the label still exists. When `children` stops\n // being a string the label unmounts, so the new callback never runs and a\n // stale `true` would keep an auto tooltip mounted over content that is no\n // longer text. That is the default `Button` path, where `tooltip` is `true`.\n setVerdict(false);\n }, [isAutoTooltipEnabled, scheduleLabelOverflowCheck, setVerdict]);\n\n // Attach ResizeObserver via callback ref to handle DOM node changes. The ref\n // also owns teardown: React hands it `null` when the label goes away. An\n // unmount effect must not repeat that. React 18 Strict Mode replays effects\n // without re-attaching refs, so the replay would drop the node and observer\n // for good and strand the queued check.\n const handleLabelElementRef = useCallback(\n (element: HTMLElement | null) => {\n // Notify the external refs\n assignRef(externalLabelRef, element);\n assignRef(labelRefOption, element);\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 (!isAutoTooltipEnabled) {\n setVerdict(false);\n\n return;\n }\n\n // No node to measure. Leave the previous verdict alone rather than\n // clearing it: turning the verdict on mounts `TooltipProvider`, which\n // remounts the label underneath it, so React detaches the old node and\n // attaches a new one within that commit. Clearing here would unmount the\n // provider, remount the label, measure it, mount the provider again — a\n // loop that never settles.\n if (!element) return;\n\n // Do NOT measure synchronously here — see `scheduleLabelOverflowCheck`.\n // This covers the node the ref just handed us, including the fresh one\n // React creates when `TooltipProvider` mounts and remounts the label.\n scheduleLabelOverflowCheck();\n\n // The observer covers every later size change.\n const obs = new ResizeObserver(() => {\n checkLabelOverflow();\n });\n\n resizeObserverRef.current = obs;\n\n obs.observe(element);\n },\n [\n externalLabelRef,\n labelRefOption,\n isAutoTooltipEnabled,\n checkLabelOverflow,\n scheduleLabelOverflowCheck,\n setVerdict,\n ],\n );\n\n const { ref: _labelPropsRef, ...finalLabelProps } = labelProps || {};\n\n // Resolved once so that both the rendering below and `isTooltipActive` speak\n // about the same tooltip.\n const resolvedTooltip = resolveTooltip({\n tooltip,\n children,\n labelProps,\n isDynamicLabel,\n isLabelOverflowed,\n });\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":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | 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";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | 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";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { _Text } from "../../content/Text.js";
4
4
  import { useI18n } from "../../../i18n/useI18n.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { _Text } from "../../content/Text.js";
3
3
  import { useI18n } from "../../../i18n/useI18n.js";
4
4
  import { c } from "react-compiler-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { _Pagination } from "../../navigation/Pagination/Pagination.js";
3
3
  import { c } from "react-compiler-runtime";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useI18n } from "../../../i18n/useI18n.js";
3
3
  import { Button } from "../../actions/index.js";
4
4
  import { ReloadIcon } from "../../../icons/ReloadIcon.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { c } from "react-compiler-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  //#region src/components/data/TableBase/RowCollection.ts
3
3
  /**
4
4
  * A `Collection<Node<T>>` over a plain row array.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { c } from "react-compiler-runtime";
4
4
  import { useEffect, useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | 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 { c } from "react-compiler-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { TooltipProvider } from "../../overlays/Tooltip/TooltipProvider.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { __Menu } from "../../actions/Menu/Menu.js";
3
3
  import { normalizeMenuAction } from "./row-menu.js";
4
4
  import { Children, cloneElement, isValidElement } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { getPaletteConfig } from "../../../tokens/palette-config.js";
3
3
  import { hashString } from "../../../tokens/color-theme.js";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { Children, Fragment, isValidElement } from "react";
3
3
 
4
4
  //#region src/components/data/TableBase/row-menu.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { _Item } from "../../content/Item/Item.js";
3
3
  import { Action } from "../../actions/Action/Action.js";
4
4
  import { keyframes, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  //#region src/components/data/TableBase/table-tree.ts
3
3
  /** Build identity and parent/child indexes without modifying consumer rows. */
4
4
  function buildTableTree(rows, getChildren, getKey) {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  //#region src/components/data/TableBase/types.ts
3
3
  /**
4
4
  * `asc | desc` rather than React Aria's `ascending | descending`: we do not use
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { c } from "react-compiler-runtime";
4
4
  import { useState } from "react";
@@ -81,7 +81,7 @@ function projectReorder(fullOrder, nextDraggable) {
81
81
  }
82
82
  const EMPTY_ORDER = [];
83
83
  function useColumnOrder(t0) {
84
- const $ = c(17);
84
+ const $ = c(16);
85
85
  const { columns, columnOrder, defaultColumnOrder, onColumnOrderChange, storage } = t0;
86
86
  let t1;
87
87
  if ($[0] !== columnOrder || $[1] !== storage) {
@@ -92,48 +92,47 @@ function useColumnOrder(t0) {
92
92
  } else t1 = $[2];
93
93
  const [storedOrder] = useState(t1);
94
94
  const [order, setOrder] = useControlledState(columnOrder, defaultColumnOrder ?? storedOrder ?? EMPTY_ORDER, onColumnOrderChange);
95
+ let ordered;
95
96
  let t2;
96
97
  if ($[3] !== columns || $[4] !== order) {
97
- t2 = applyColumnOrder(columns, order);
98
+ ordered = applyColumnOrder(columns, order);
99
+ t2 = ordered.map(_temp);
98
100
  $[3] = columns;
99
101
  $[4] = order;
100
- $[5] = t2;
101
- } else t2 = $[5];
102
- const ordered = t2;
102
+ $[5] = ordered;
103
+ $[6] = t2;
104
+ } else {
105
+ ordered = $[5];
106
+ t2 = $[6];
107
+ }
108
+ const fullOrder = t2;
103
109
  let t3;
104
- if ($[6] !== ordered) {
105
- t3 = ordered.map(_temp);
106
- $[6] = ordered;
107
- $[7] = t3;
108
- } else t3 = $[7];
109
- const fullOrder = t3;
110
- let t4;
111
- if ($[8] !== columnOrder || $[9] !== fullOrder || $[10] !== setOrder || $[11] !== storage) {
112
- t4 = (nextDraggable) => {
110
+ if ($[7] !== columnOrder || $[8] !== fullOrder || $[9] !== setOrder || $[10] !== storage) {
111
+ t3 = (nextDraggable) => {
113
112
  const next = projectReorder(fullOrder, nextDraggable);
114
113
  setOrder(next);
115
114
  if (columnOrder === void 0) storage.write({ columnOrder: next });
116
115
  };
117
- $[8] = columnOrder;
118
- $[9] = fullOrder;
119
- $[10] = setOrder;
120
- $[11] = storage;
121
- $[12] = t4;
122
- } else t4 = $[12];
123
- const reorder = useEvent(t4);
124
- let t5;
125
- if ($[13] !== fullOrder || $[14] !== ordered || $[15] !== reorder) {
126
- t5 = {
116
+ $[7] = columnOrder;
117
+ $[8] = fullOrder;
118
+ $[9] = setOrder;
119
+ $[10] = storage;
120
+ $[11] = t3;
121
+ } else t3 = $[11];
122
+ const reorder = useEvent(t3);
123
+ let t4;
124
+ if ($[12] !== fullOrder || $[13] !== ordered || $[14] !== reorder) {
125
+ t4 = {
127
126
  columns: ordered,
128
127
  order: fullOrder,
129
128
  reorder
130
129
  };
131
- $[13] = fullOrder;
132
- $[14] = ordered;
133
- $[15] = reorder;
134
- $[16] = t5;
135
- } else t5 = $[16];
136
- return t5;
130
+ $[12] = fullOrder;
131
+ $[13] = ordered;
132
+ $[14] = reorder;
133
+ $[15] = t4;
134
+ } else t4 = $[15];
135
+ return t4;
137
136
  }
138
137
  function _temp(column) {
139
138
  return column.key;
@@ -1 +1 @@
1
- {"version":3,"file":"use-column-order.js","names":["useControlledState","useMemo","useState","useEvent","CubeResolvedColumn","CubeTableColumn","useTableStorage","applyColumnOrder","columns","T","order","length","present","Set","map","column","key","rank","Map","forEach","index","has","set","size","carried","sourceIndex","own","get","sort","a","b","entry","isColumnDraggable","Pick","isEnabled","isStructural","pin","isReorderable","getDraggableColumnKeys","filter","projectReorder","fullOrder","nextDraggable","draggable","next","cursor","slot","EMPTY_ORDER","UseColumnOrderOptions","columnOrder","defaultColumnOrder","onColumnOrderChange","storage","ReturnType","UseColumnOrderResult","reorder","useColumnOrder","t0","$","_c","t1","undefined","initial","storedOrder","setOrder","value","t2","ordered","t3","_temp","t4","write","t5"],"sources":["../../../../src/components/data/TableBase/use-column-order.ts"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { useMemo, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport type { CubeResolvedColumn, CubeTableColumn } from './types';\nimport type { useTableStorage } from './use-table-storage';\n\n/**\n * Reorders the source columns to match `order`.\n *\n * Rank-based rather than filter-then-concat, because `order` is routinely\n * *stale*: it was persisted or lifted into page state before the current\n * `columns` array existed. A column missing from it inherits the rank of the\n * nearest preceding known column plus a half step, so it lands immediately after\n * the neighbour it had in the source array instead of being swept to the end. A\n * new leading column keeps its lead.\n *\n * Applied to the SOURCE array, before `useTableColumns` — so hidden-column\n * filtering, structural injection, pinned hoisting and `aria-colindex` all still\n * happen downstream, and `columnOrder` can never fight `pin`.\n */\nexport function applyColumnOrder<T>(\n columns: CubeTableColumn<T>[],\n order?: readonly string[],\n): CubeTableColumn<T>[] {\n if (!order?.length) return columns;\n\n const present = new Set(columns.map((column) => column.key));\n const rank = new Map<string, number>();\n\n order.forEach((key, index) => {\n // A key for a column that no longer exists is ignored rather than treated as\n // a gap, and a duplicate keeps its first position.\n if (present.has(key) && !rank.has(key)) rank.set(key, index);\n });\n\n if (!rank.size) return columns;\n\n let carried = -1;\n\n return columns\n .map((column, sourceIndex) => {\n const own = rank.get(column.key);\n\n if (own != null) carried = own;\n\n return { column, sourceIndex, rank: own ?? carried + 0.5 };\n })\n .sort((a, b) => a.rank - b.rank || a.sourceIndex - b.sourceIndex)\n .map((entry) => entry.column);\n}\n\n/**\n * Whether a column can be picked up and moved.\n *\n * The single shared predicate: `DataTable` builds the draggable key list from\n * it and `TableView` decides which `<th>` is a drag source from it, so the two\n * cannot drift. A renderer disagreeing with the state behind it is exactly how\n * the drop indicator that never matched its selector happened.\n *\n * Pinned columns are excluded, for three reasons that all point the same way: a\n * pinned `<th>` is `position: sticky`, so under horizontal scroll its rect sits\n * on top of columns it is nowhere near and React Aria's drop-target binary\n * search goes wrong; `use-table-columns` hoists pinned columns to the edges\n * regardless of source order, so a cross-boundary drop would be undone\n * immediately; and `pin` is already the ordering authority there. What that buys\n * is a draggable set that is one contiguous, non-sticky run — every permutation\n * of which stays monotonic, which is what the delegate needs.\n */\nexport function isColumnDraggable<T>(\n column: Pick<CubeResolvedColumn<T>, 'isStructural' | 'pin' | 'isReorderable'>,\n isEnabled: boolean,\n): boolean {\n return (\n isEnabled &&\n !column.isStructural &&\n column.pin == null &&\n (column.isReorderable ?? true)\n );\n}\n\nexport function getDraggableColumnKeys<T>(\n columns: readonly CubeResolvedColumn<T>[],\n isEnabled: boolean,\n): string[] {\n return columns\n .filter((column) => isColumnDraggable(column, isEnabled))\n .map((column) => column.key);\n}\n\n/**\n * Folds a permutation of the draggable subset back into the full order.\n *\n * Only the slots the draggable keys already occupy are rewritten, so a hidden\n * column, a pinned one, or one that opted out keeps its absolute index and\n * cannot be displaced by a drag it took no part in.\n *\n * The visible consequence, worth knowing: a hidden column between two draggable\n * ones keeps its slot rather than following a neighbour, so it may come back\n * between different columns than it left. Predictable beats clever.\n */\nexport function projectReorder(\n fullOrder: readonly string[],\n nextDraggable: readonly string[],\n): string[] {\n const draggable = new Set(nextDraggable);\n const next = [...fullOrder];\n let cursor = 0;\n\n for (let slot = 0; slot < next.length; slot++) {\n if (draggable.has(next[slot])) next[slot] = nextDraggable[cursor++];\n }\n\n return next;\n}\n\nconst EMPTY_ORDER: string[] = [];\n\nexport interface UseColumnOrderOptions<T> {\n columns: CubeTableColumn<T>[];\n columnOrder?: string[];\n defaultColumnOrder?: string[];\n onColumnOrderChange?: (order: string[]) => void;\n storage: ReturnType<typeof useTableStorage>;\n}\n\nexport interface UseColumnOrderResult<T> {\n /** `columns`, reordered. Feed this to `useTableColumns`. */\n columns: CubeTableColumn<T>[];\n /** The full key list in its current order, including hidden and pinned keys. */\n order: string[];\n /** Takes the reordered DRAGGABLE keys and commits the full order. */\n reorder: (nextDraggable: string[]) => void;\n}\n\nexport function useColumnOrder<T>({\n columns,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n storage,\n}: UseColumnOrderOptions<T>): UseColumnOrderResult<T> {\n // Seeded once, like `ownColumnWidths`: a controlled `columnOrder` belongs to\n // the page, so restoring over it would fight the page's own source of truth.\n const [storedOrder] = useState(() =>\n columnOrder === undefined && storage.has('columnOrder')\n ? storage.initial.columnOrder\n : undefined,\n );\n\n // An empty array means \"no order\", which `applyColumnOrder` treats as a\n // no-op — same shape `useTableSorts` uses for its own empty default, and it\n // keeps `useControlledState` off the `undefined` overload.\n const [order, setOrder] = useControlledState<string[]>(\n columnOrder as string[],\n defaultColumnOrder ?? storedOrder ?? EMPTY_ORDER,\n onColumnOrderChange as (value: string[]) => void,\n );\n\n const ordered = useMemo(\n () => applyColumnOrder(columns, order),\n [columns, order],\n );\n\n // Always the FULL source key list, in current order — so a key never drops out\n // of persisted state just because its column happened to be hidden.\n const fullOrder = useMemo(\n () => ordered.map((column) => column.key),\n [ordered],\n );\n\n const reorder = useEvent((nextDraggable: string[]) => {\n const next = projectReorder(fullOrder, nextDraggable);\n\n setOrder(next);\n\n // Only what the table OWNS is persisted — a controlled order belongs to the\n // page, and storing it would fight the page on the next mount. Same rule\n // `handleColumnResizeEnd` follows for widths.\n if (columnOrder === undefined) storage.write({ columnOrder: next });\n });\n\n return { columns: ordered, order: fullOrder, reorder };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-column-order.js","names":["useControlledState","useState","useEvent","CubeResolvedColumn","CubeTableColumn","useTableStorage","applyColumnOrder","columns","T","order","length","present","Set","map","column","key","rank","Map","forEach","index","has","set","size","carried","sourceIndex","own","get","sort","a","b","entry","isColumnDraggable","Pick","isEnabled","isStructural","pin","isReorderable","getDraggableColumnKeys","filter","projectReorder","fullOrder","nextDraggable","draggable","next","cursor","slot","EMPTY_ORDER","UseColumnOrderOptions","columnOrder","defaultColumnOrder","onColumnOrderChange","storage","ReturnType","UseColumnOrderResult","reorder","useColumnOrder","t0","$","_c","t1","undefined","initial","storedOrder","setOrder","value","ordered","t2","_temp","t3","write","t4"],"sources":["../../../../src/components/data/TableBase/use-column-order.ts"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport type { CubeResolvedColumn, CubeTableColumn } from './types';\nimport type { useTableStorage } from './use-table-storage';\n\n/**\n * Reorders the source columns to match `order`.\n *\n * Rank-based rather than filter-then-concat, because `order` is routinely\n * *stale*: it was persisted or lifted into page state before the current\n * `columns` array existed. A column missing from it inherits the rank of the\n * nearest preceding known column plus a half step, so it lands immediately after\n * the neighbour it had in the source array instead of being swept to the end. A\n * new leading column keeps its lead.\n *\n * Applied to the SOURCE array, before `useTableColumns` — so hidden-column\n * filtering, structural injection, pinned hoisting and `aria-colindex` all still\n * happen downstream, and `columnOrder` can never fight `pin`.\n */\nexport function applyColumnOrder<T>(\n columns: CubeTableColumn<T>[],\n order?: readonly string[],\n): CubeTableColumn<T>[] {\n if (!order?.length) return columns;\n\n const present = new Set(columns.map((column) => column.key));\n const rank = new Map<string, number>();\n\n order.forEach((key, index) => {\n // A key for a column that no longer exists is ignored rather than treated as\n // a gap, and a duplicate keeps its first position.\n if (present.has(key) && !rank.has(key)) rank.set(key, index);\n });\n\n if (!rank.size) return columns;\n\n let carried = -1;\n\n return columns\n .map((column, sourceIndex) => {\n const own = rank.get(column.key);\n\n if (own != null) carried = own;\n\n return { column, sourceIndex, rank: own ?? carried + 0.5 };\n })\n .sort((a, b) => a.rank - b.rank || a.sourceIndex - b.sourceIndex)\n .map((entry) => entry.column);\n}\n\n/**\n * Whether a column can be picked up and moved.\n *\n * The single shared predicate: `DataTable` builds the draggable key list from\n * it and `TableView` decides which `<th>` is a drag source from it, so the two\n * cannot drift. A renderer disagreeing with the state behind it is exactly how\n * the drop indicator that never matched its selector happened.\n *\n * Pinned columns are excluded, for three reasons that all point the same way: a\n * pinned `<th>` is `position: sticky`, so under horizontal scroll its rect sits\n * on top of columns it is nowhere near and React Aria's drop-target binary\n * search goes wrong; `use-table-columns` hoists pinned columns to the edges\n * regardless of source order, so a cross-boundary drop would be undone\n * immediately; and `pin` is already the ordering authority there. What that buys\n * is a draggable set that is one contiguous, non-sticky run — every permutation\n * of which stays monotonic, which is what the delegate needs.\n */\nexport function isColumnDraggable<T>(\n column: Pick<CubeResolvedColumn<T>, 'isStructural' | 'pin' | 'isReorderable'>,\n isEnabled: boolean,\n): boolean {\n return (\n isEnabled &&\n !column.isStructural &&\n column.pin == null &&\n (column.isReorderable ?? true)\n );\n}\n\nexport function getDraggableColumnKeys<T>(\n columns: readonly CubeResolvedColumn<T>[],\n isEnabled: boolean,\n): string[] {\n return columns\n .filter((column) => isColumnDraggable(column, isEnabled))\n .map((column) => column.key);\n}\n\n/**\n * Folds a permutation of the draggable subset back into the full order.\n *\n * Only the slots the draggable keys already occupy are rewritten, so a hidden\n * column, a pinned one, or one that opted out keeps its absolute index and\n * cannot be displaced by a drag it took no part in.\n *\n * The visible consequence, worth knowing: a hidden column between two draggable\n * ones keeps its slot rather than following a neighbour, so it may come back\n * between different columns than it left. Predictable beats clever.\n */\nexport function projectReorder(\n fullOrder: readonly string[],\n nextDraggable: readonly string[],\n): string[] {\n const draggable = new Set(nextDraggable);\n const next = [...fullOrder];\n let cursor = 0;\n\n for (let slot = 0; slot < next.length; slot++) {\n if (draggable.has(next[slot])) next[slot] = nextDraggable[cursor++];\n }\n\n return next;\n}\n\nconst EMPTY_ORDER: string[] = [];\n\nexport interface UseColumnOrderOptions<T> {\n columns: CubeTableColumn<T>[];\n columnOrder?: string[];\n defaultColumnOrder?: string[];\n onColumnOrderChange?: (order: string[]) => void;\n storage: ReturnType<typeof useTableStorage>;\n}\n\nexport interface UseColumnOrderResult<T> {\n /** `columns`, reordered. Feed this to `useTableColumns`. */\n columns: CubeTableColumn<T>[];\n /** The full key list in its current order, including hidden and pinned keys. */\n order: string[];\n /** Takes the reordered DRAGGABLE keys and commits the full order. */\n reorder: (nextDraggable: string[]) => void;\n}\n\nexport function useColumnOrder<T>({\n columns,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n storage,\n}: UseColumnOrderOptions<T>): UseColumnOrderResult<T> {\n // Seeded once, like `ownColumnWidths`: a controlled `columnOrder` belongs to\n // the page, so restoring over it would fight the page's own source of truth.\n const [storedOrder] = useState(() =>\n columnOrder === undefined && storage.has('columnOrder')\n ? storage.initial.columnOrder\n : undefined,\n );\n\n // An empty array means \"no order\", which `applyColumnOrder` treats as a\n // no-op — same shape `useTableSorts` uses for its own empty default, and it\n // keeps `useControlledState` off the `undefined` overload.\n const [order, setOrder] = useControlledState<string[]>(\n columnOrder as string[],\n defaultColumnOrder ?? storedOrder ?? EMPTY_ORDER,\n onColumnOrderChange as (value: string[]) => void,\n );\n\n const ordered = applyColumnOrder(columns, order);\n\n // Always the FULL source key list, in current order — so a key never drops out\n // of persisted state just because its column happened to be hidden.\n const fullOrder = ordered.map((column) => column.key);\n\n const reorder = useEvent((nextDraggable: string[]) => {\n const next = projectReorder(fullOrder, nextDraggable);\n\n setOrder(next);\n\n // Only what the table OWNS is persisted — a controlled order belongs to the\n // page, and storing it would fight the page on the next mount. Same rule\n // `handleColumnResizeEnd` follows for widths.\n if (columnOrder === undefined) storage.write({ columnOrder: next });\n });\n\n return { columns: ordered, order: fullOrder, reorder };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { c } from "react-compiler-runtime";
3
3
  import { useLayoutEffect, useState } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { c } from "react-compiler-runtime";
3
3
  import { useLayoutEffect, useRef } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { c } from "react-compiler-runtime";
3
3
  import { useLayoutEffect, useState } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { c } from "react-compiler-runtime";
3
3
 
4
4
  //#region src/components/data/TableBase/use-table-columns.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { useDebouncedValue } from "../../../_internal/hooks/use-debounced-value.js";
4
4
  import { getColumnText } from "./use-table-columns.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { RowCollection } from "./RowCollection.js";
4
4
  import { useCallback, useMemo, useRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-0b79a39 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-c02e70f | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { getColumnText, getColumnValue } from "./use-table-columns.js";
4
4
  import { c } from "react-compiler-runtime";
@@ -15,7 +15,7 @@ import { useControlledState } from "@react-stately/utils";
15
15
  * column reduces it to `asc ↔ desc`.
16
16
  */
17
17
  function useTableSort(t0) {
18
- const $ = c(28);
18
+ const $ = c(26);
19
19
  const { columns, rows, mode, sort: sortProp, defaultSort, onSortChange } = t0;
20
20
  let t1;
21
21
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -92,28 +92,7 @@ function useTableSort(t0) {
92
92
  const setColumnSort = useEvent(t4);
93
93
  let t5;
94
94
  if ($[13] !== collator || $[14] !== columns || $[15] !== resolvedMode || $[16] !== rows || $[17] !== sort) {
95
- bb0: {
96
- if (resolvedMode !== "client" || !sort) {
97
- t5 = rows;
98
- break bb0;
99
- }
100
- let t6;
101
- if ($[19] !== sort) {
102
- t6 = (entry_1) => entry_1.key === sort.columnKey;
103
- $[19] = sort;
104
- $[20] = t6;
105
- } else t6 = $[20];
106
- const column_3 = columns.find(t6);
107
- if (!column_3) {
108
- t5 = rows;
109
- break bb0;
110
- }
111
- const direction_0 = sort.direction === "asc" ? 1 : -1;
112
- t5 = rows.map(_temp2).sort((a, b) => {
113
- const result = compareByColumn(column_3, collator, a.row, a.index, b.row, b.index);
114
- return result !== 0 ? result * direction_0 : a.index - b.index;
115
- }).map(_temp3);
116
- }
95
+ t5 = resolvedMode === "client" && sort ? sortRows(rows, [sort], columns, collator) : rows;
117
96
  $[13] = collator;
118
97
  $[14] = columns;
119
98
  $[15] = resolvedMode;
@@ -123,7 +102,7 @@ function useTableSort(t0) {
123
102
  } else t5 = $[18];
124
103
  const sortedRows = t5;
125
104
  let t6;
126
- if ($[21] !== isSortable || $[22] !== resolvedMode || $[23] !== setColumnSort || $[24] !== sort || $[25] !== sortedRows || $[26] !== toggleSort) {
105
+ if ($[19] !== isSortable || $[20] !== resolvedMode || $[21] !== setColumnSort || $[22] !== sort || $[23] !== sortedRows || $[24] !== toggleSort) {
127
106
  t6 = {
128
107
  sort,
129
108
  sortedRows,
@@ -132,27 +111,44 @@ function useTableSort(t0) {
132
111
  isSortable,
133
112
  mode: resolvedMode
134
113
  };
135
- $[21] = isSortable;
136
- $[22] = resolvedMode;
137
- $[23] = setColumnSort;
138
- $[24] = sort;
139
- $[25] = sortedRows;
140
- $[26] = toggleSort;
141
- $[27] = t6;
142
- } else t6 = $[27];
114
+ $[19] = isSortable;
115
+ $[20] = resolvedMode;
116
+ $[21] = setColumnSort;
117
+ $[22] = sort;
118
+ $[23] = sortedRows;
119
+ $[24] = toggleSort;
120
+ $[25] = t6;
121
+ } else t6 = $[25];
143
122
  return t6;
144
123
  }
145
- function _temp3(entry_2) {
146
- return entry_2.row;
124
+ /**
125
+ * `rows` ordered by `sorts`, the first sort taking precedence. Sorts naming a
126
+ * column the table does not have are skipped, and `rows` itself comes back when
127
+ * none is left.
128
+ *
129
+ * `map`/`sort`/`map` rather than sorting in place: `rows` is the caller's array
130
+ * and `Array.prototype.sort` mutates. Carrying the original index also makes the
131
+ * sort stable across engines, including when every sort ties.
132
+ */
133
+ function _temp(column) {
134
+ return column.isSortable;
147
135
  }
148
- function _temp2(row, index) {
149
- return {
136
+ function sortRows(rows, sorts, columns, collator) {
137
+ const active = sorts.map((sort) => ({
138
+ sort,
139
+ column: columns.find((entry) => entry.key === sort.columnKey)
140
+ })).filter((entry) => entry.column != null);
141
+ if (!active.length) return rows;
142
+ return rows.map((row, index) => ({
150
143
  row,
151
144
  index
152
- };
153
- }
154
- function _temp(column) {
155
- return column.isSortable;
145
+ })).sort((a, b) => {
146
+ for (const { sort, column } of active) {
147
+ const result = compareByColumn(column, collator, a.row, a.index, b.row, b.index);
148
+ if (result !== 0) return result * (sort.direction === "asc" ? 1 : -1);
149
+ }
150
+ return a.index - b.index;
151
+ }).map((entry) => entry.row);
156
152
  }
157
153
  function compareByColumn(column, collator, rowA, indexA, rowB, indexB) {
158
154
  const valueA = getColumnValue(column, rowA, indexA);
@@ -170,5 +166,5 @@ function compareByColumn(column, collator, rowA, indexA, rowB, indexB) {
170
166
  }
171
167
 
172
168
  //#endregion
173
- export { compareByColumn, useTableSort };
169
+ export { compareByColumn, sortRows, useTableSort };
174
170
  //# sourceMappingURL=use-table-sort.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-sort.js","names":["useControlledState","useMemo","useCollator","useEvent","getColumnText","getColumnValue","CubeTableColumn","CubeTableSort","CubeTableSortDirection","CubeTableSortMode","UseTableSortOptions","columns","T","rows","mode","sort","defaultSort","onSortChange","UseTableSortResult","sortedRows","toggleSort","columnKey","setColumnSort","direction","isSortable","column","useTableSort","t0","$","_c","sortProp","t1","Symbol","for","numeric","sensitivity","collator","setSort","value","hasSortableColumn","some","_temp","resolvedMode","t2","column_0","t3","column_1","find","entry","key","disallowSortRemoval","t4","columnKey_0","column_2","entry_0","t5","bb0","t6","entry_1","column_3","direction_0","map","_temp2","a","b","result","compareByColumn","row","index","_temp3","entry_2","Intl","Collator","rowA","indexA","rowB","indexB","valueA","valueB","compare","Number","Date","getTime","textA","String","textB"],"sources":["../../../../src/components/data/TableBase/use-table-sort.ts"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { useMemo } from 'react';\nimport { useCollator } from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport { getColumnText, getColumnValue } from './use-table-columns';\n\nimport type {\n CubeTableColumn,\n CubeTableSort,\n CubeTableSortDirection,\n} from './types';\n\nexport type CubeTableSortMode = 'client' | 'server' | 'off';\n\nexport interface UseTableSortOptions<T> {\n columns: CubeTableColumn<T>[];\n rows: readonly T[];\n /** @default 'client' when any column is sortable, else 'off' */\n mode?: CubeTableSortMode;\n sort?: CubeTableSort | null;\n defaultSort?: CubeTableSort | null;\n onSortChange?: (sort: CubeTableSort | null) => void;\n}\n\nexport interface UseTableSortResult<T> {\n sort: CubeTableSort | null;\n /** `rows` reordered in client mode; the original array otherwise. */\n sortedRows: readonly T[];\n /** Advances a column through the sort cycle. */\n toggleSort: (columnKey: string) => void;\n /**\n * Sets a column's direction outright. `null` clears it.\n *\n * For the column menu's reserved sort keys, which have to reach a specific\n * direction in one step rather than cycling to it.\n */\n setColumnSort: (\n columnKey: string,\n direction: CubeTableSortDirection | null,\n ) => void;\n isSortable: (column: CubeTableColumn<T>) => boolean;\n /**\n * The mode after defaulting. The renderer needs this exact answer to decide\n * whether a header is clickable, and deriving it a second time at the call\n * site is how `DataTable` ended up sorting on `defaultSorts` but ignoring\n * every click.\n */\n mode: CubeTableSortMode;\n}\n\n/**\n * Sort state plus, in client mode, the reordered rows.\n *\n * The cycle is tri-state — `asc → desc → unsorted` — matching ag-grid's default\n * `sortingOrder`, because losing the ability to get back to the source order is\n * a real loss when the source order is meaningful. `disallowSortRemoval` on a\n * column reduces it to `asc ↔ desc`.\n */\nexport function useTableSort<T>({\n columns,\n rows,\n mode,\n sort: sortProp,\n defaultSort,\n onSortChange,\n}: UseTableSortOptions<T>): UseTableSortResult<T> {\n // A collator gives locale-correct, case-insensitive ordering — \"Ä\" sorts next\n // to \"A\" rather than after \"Z\", which a raw `<` comparison gets wrong.\n const collator = useCollator({ numeric: true, sensitivity: 'base' });\n\n const [sort, setSort] = useControlledState<CubeTableSort | null>(\n sortProp as CubeTableSort | null,\n defaultSort ?? null,\n onSortChange as (value: CubeTableSort | null) => void,\n );\n\n const hasSortableColumn = columns.some((column) => column.isSortable);\n const resolvedMode: CubeTableSortMode =\n mode ?? (hasSortableColumn ? 'client' : 'off');\n\n const isSortable = useEvent(\n (column: CubeTableColumn<T>) =>\n resolvedMode !== 'off' && column.isSortable === true,\n );\n\n const toggleSort = useEvent((columnKey: string) => {\n const column = columns.find((entry) => entry.key === columnKey);\n\n if (!column || !isSortable(column)) return;\n\n if (sort?.columnKey !== columnKey) {\n setSort({ columnKey, direction: 'asc' });\n\n return;\n }\n\n if (sort.direction === 'asc') {\n setSort({ columnKey, direction: 'desc' });\n\n return;\n }\n\n setSort(\n column.disallowSortRemoval ? { columnKey, direction: 'asc' } : null,\n );\n });\n\n /**\n * Set the column's direction outright instead of advancing the cycle — see\n * `use-table-sorts.ts` for why the column menu cannot reuse `toggleSort`.\n */\n const setColumnSort = useEvent(\n (columnKey: string, direction: CubeTableSortDirection | null) => {\n const column = columns.find((entry) => entry.key === columnKey);\n\n if (!column || !isSortable(column)) return;\n\n if (direction == null) {\n // Clearing a column that is not the sorted one is a no-op rather than a\n // reset, and `disallowSortRemoval` refuses the clear outright.\n if (sort?.columnKey !== columnKey || column.disallowSortRemoval) return;\n\n setSort(null);\n\n return;\n }\n\n if (sort?.columnKey === columnKey && sort.direction === direction) return;\n\n setSort({ columnKey, direction });\n },\n );\n\n const sortedRows = useMemo(() => {\n if (resolvedMode !== 'client' || !sort) return rows;\n\n const column = columns.find((entry) => entry.key === sort.columnKey);\n\n if (!column) return rows;\n\n const direction = sort.direction === 'asc' ? 1 : -1;\n\n // `map`/`sort`/`map` rather than sorting in place: `rows` is the caller's\n // array and `Array.prototype.sort` mutates. Carrying the original index also\n // makes the sort stable across engines.\n return rows\n .map((row, index) => ({ row, index }))\n .sort((a, b) => {\n const result = compareByColumn(\n column,\n collator,\n a.row,\n a.index,\n b.row,\n b.index,\n );\n\n return result !== 0 ? result * direction : a.index - b.index;\n })\n .map((entry) => entry.row);\n }, [resolvedMode, sort, rows, columns, collator]);\n\n // The resolved mode is returned rather than left for the caller to derive\n // again: the renderer needs the same answer to decide whether a header is\n // clickable, and two independent derivations drift.\n return {\n sort,\n sortedRows,\n toggleSort,\n setColumnSort,\n isSortable,\n mode: resolvedMode,\n };\n}\n\nexport function compareByColumn<T>(\n column: CubeTableColumn<T>,\n collator: Intl.Collator,\n rowA: T,\n indexA: number,\n rowB: T,\n indexB: number,\n): number {\n const valueA = getColumnValue(column, rowA, indexA);\n const valueB = getColumnValue(column, rowB, indexB);\n\n if (column.compare) return column.compare(valueA, valueB, rowA, rowB);\n\n // Nullish always sorts first, then gets flipped with the direction. Mixing\n // them into the value comparison instead produces an unstable order.\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n return valueA - valueB;\n }\n if (typeof valueA === 'boolean' && typeof valueB === 'boolean') {\n return Number(valueA) - Number(valueB);\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n\n // Fall back to display text, so a column with a `format` sorts the way it\n // reads rather than the way it is stored.\n const textA = getColumnText(column, rowA, indexA) ?? String(valueA);\n const textB = getColumnText(column, rowB, indexB) ?? String(valueB);\n\n return collator.compare(textA, textB);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-table-sort.js","names":["useControlledState","useCollator","useEvent","getColumnText","getColumnValue","CubeTableColumn","CubeTableSort","CubeTableSortDirection","CubeTableSortMode","UseTableSortOptions","columns","T","rows","mode","sort","defaultSort","onSortChange","UseTableSortResult","sortedRows","toggleSort","columnKey","setColumnSort","direction","isSortable","column","useTableSort","t0","$","_c","sortProp","t1","Symbol","for","numeric","sensitivity","collator","setSort","value","hasSortableColumn","some","_temp","resolvedMode","t2","column_0","t3","column_1","find","entry","key","disallowSortRemoval","t4","columnKey_0","column_2","entry_0","t5","sortRows","t6","sorts","Intl","Collator","active","map","filter","length","row","index","a","b","result","compareByColumn","rowA","indexA","rowB","indexB","valueA","valueB","compare","Number","Date","getTime","textA","String","textB"],"sources":["../../../../src/components/data/TableBase/use-table-sort.ts"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { useCollator } from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport { getColumnText, getColumnValue } from './use-table-columns';\n\nimport type {\n CubeTableColumn,\n CubeTableSort,\n CubeTableSortDirection,\n} from './types';\n\nexport type CubeTableSortMode = 'client' | 'server' | 'off';\n\nexport interface UseTableSortOptions<T> {\n columns: CubeTableColumn<T>[];\n rows: readonly T[];\n /** @default 'client' when any column is sortable, else 'off' */\n mode?: CubeTableSortMode;\n sort?: CubeTableSort | null;\n defaultSort?: CubeTableSort | null;\n onSortChange?: (sort: CubeTableSort | null) => void;\n}\n\nexport interface UseTableSortResult<T> {\n sort: CubeTableSort | null;\n /** `rows` reordered in client mode; the original array otherwise. */\n sortedRows: readonly T[];\n /** Advances a column through the sort cycle. */\n toggleSort: (columnKey: string) => void;\n /**\n * Sets a column's direction outright. `null` clears it.\n *\n * For the column menu's reserved sort keys, which have to reach a specific\n * direction in one step rather than cycling to it.\n */\n setColumnSort: (\n columnKey: string,\n direction: CubeTableSortDirection | null,\n ) => void;\n isSortable: (column: CubeTableColumn<T>) => boolean;\n /**\n * The mode after defaulting. The renderer needs this exact answer to decide\n * whether a header is clickable, and deriving it a second time at the call\n * site is how `DataTable` ended up sorting on `defaultSorts` but ignoring\n * every click.\n */\n mode: CubeTableSortMode;\n}\n\n/**\n * Sort state plus, in client mode, the reordered rows.\n *\n * The cycle is tri-state — `asc → desc → unsorted` — matching ag-grid's default\n * `sortingOrder`, because losing the ability to get back to the source order is\n * a real loss when the source order is meaningful. `disallowSortRemoval` on a\n * column reduces it to `asc ↔ desc`.\n */\nexport function useTableSort<T>({\n columns,\n rows,\n mode,\n sort: sortProp,\n defaultSort,\n onSortChange,\n}: UseTableSortOptions<T>): UseTableSortResult<T> {\n // A collator gives locale-correct, case-insensitive ordering — \"Ä\" sorts next\n // to \"A\" rather than after \"Z\", which a raw `<` comparison gets wrong.\n const collator = useCollator({ numeric: true, sensitivity: 'base' });\n\n const [sort, setSort] = useControlledState<CubeTableSort | null>(\n sortProp as CubeTableSort | null,\n defaultSort ?? null,\n onSortChange as (value: CubeTableSort | null) => void,\n );\n\n const hasSortableColumn = columns.some((column) => column.isSortable);\n const resolvedMode: CubeTableSortMode =\n mode ?? (hasSortableColumn ? 'client' : 'off');\n\n const isSortable = useEvent(\n (column: CubeTableColumn<T>) =>\n resolvedMode !== 'off' && column.isSortable === true,\n );\n\n const toggleSort = useEvent((columnKey: string) => {\n const column = columns.find((entry) => entry.key === columnKey);\n\n if (!column || !isSortable(column)) return;\n\n if (sort?.columnKey !== columnKey) {\n setSort({ columnKey, direction: 'asc' });\n\n return;\n }\n\n if (sort.direction === 'asc') {\n setSort({ columnKey, direction: 'desc' });\n\n return;\n }\n\n setSort(\n column.disallowSortRemoval ? { columnKey, direction: 'asc' } : null,\n );\n });\n\n /**\n * Set the column's direction outright instead of advancing the cycle — see\n * `use-table-sorts.ts` for why the column menu cannot reuse `toggleSort`.\n */\n const setColumnSort = useEvent(\n (columnKey: string, direction: CubeTableSortDirection | null) => {\n const column = columns.find((entry) => entry.key === columnKey);\n\n if (!column || !isSortable(column)) return;\n\n if (direction == null) {\n // Clearing a column that is not the sorted one is a no-op rather than a\n // reset, and `disallowSortRemoval` refuses the clear outright.\n if (sort?.columnKey !== columnKey || column.disallowSortRemoval) return;\n\n setSort(null);\n\n return;\n }\n\n if (sort?.columnKey === columnKey && sort.direction === direction) return;\n\n setSort({ columnKey, direction });\n },\n );\n\n const sortedRows =\n resolvedMode === 'client' && sort\n ? sortRows(rows, [sort], columns, collator)\n : rows;\n\n // The resolved mode is returned rather than left for the caller to derive\n // again: the renderer needs the same answer to decide whether a header is\n // clickable, and two independent derivations drift.\n return {\n sort,\n sortedRows,\n toggleSort,\n setColumnSort,\n isSortable,\n mode: resolvedMode,\n };\n}\n\n/**\n * `rows` ordered by `sorts`, the first sort taking precedence. Sorts naming a\n * column the table does not have are skipped, and `rows` itself comes back when\n * none is left.\n *\n * `map`/`sort`/`map` rather than sorting in place: `rows` is the caller's array\n * and `Array.prototype.sort` mutates. Carrying the original index also makes the\n * sort stable across engines, including when every sort ties.\n */\nexport function sortRows<T>(\n rows: readonly T[],\n sorts: readonly CubeTableSort[],\n columns: CubeTableColumn<T>[],\n collator: Intl.Collator,\n): readonly T[] {\n const active = sorts\n .map((sort) => ({\n sort,\n column: columns.find((entry) => entry.key === sort.columnKey),\n }))\n .filter(\n (entry): entry is { sort: CubeTableSort; column: CubeTableColumn<T> } =>\n entry.column != null,\n );\n\n if (!active.length) return rows;\n\n return rows\n .map((row, index) => ({ row, index }))\n .sort((a, b) => {\n for (const { sort, column } of active) {\n const result = compareByColumn(\n column,\n collator,\n a.row,\n a.index,\n b.row,\n b.index,\n );\n\n if (result !== 0) {\n return result * (sort.direction === 'asc' ? 1 : -1);\n }\n }\n\n return a.index - b.index;\n })\n .map((entry) => entry.row);\n}\n\nexport function compareByColumn<T>(\n column: CubeTableColumn<T>,\n collator: Intl.Collator,\n rowA: T,\n indexA: number,\n rowB: T,\n indexB: number,\n): number {\n const valueA = getColumnValue(column, rowA, indexA);\n const valueB = getColumnValue(column, rowB, indexB);\n\n if (column.compare) return column.compare(valueA, valueB, rowA, rowB);\n\n // Nullish always sorts first, then gets flipped with the direction. Mixing\n // them into the value comparison instead produces an unstable order.\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n\n if (typeof valueA === 'number' && typeof valueB === 'number') {\n return valueA - valueB;\n }\n if (typeof valueA === 'boolean' && typeof valueB === 'boolean') {\n return Number(valueA) - Number(valueB);\n }\n if (valueA instanceof Date && valueB instanceof Date) {\n return valueA.getTime() - valueB.getTime();\n }\n\n // Fall back to display text, so a column with a `format` sorts the way it\n // reads rather than the way it is stored.\n const textA = getColumnText(column, rowA, indexA) ?? String(valueA);\n const textB = getColumnText(column, rowB, indexB) ?? String(valueB);\n\n return collator.compare(textA, textB);\n}\n"],"mappings":"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"}