@cube-dev/ui-kit 0.158.0 → 0.159.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/dist/CHANGELOG.md +139 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +10 -4
  20. package/dist/components/actions/Button/Button.js.map +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  25. package/dist/components/actions/CommandMenu/styled.js +1 -1
  26. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  27. package/dist/components/actions/ItemActionContext.js +1 -1
  28. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  29. package/dist/components/actions/Link/Link.js +1 -1
  30. package/dist/components/actions/Menu/Menu.js +1 -1
  31. package/dist/components/actions/Menu/MenuItem.js +1 -1
  32. package/dist/components/actions/Menu/MenuSection.js +1 -1
  33. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  36. package/dist/components/actions/Menu/context.js +1 -1
  37. package/dist/components/actions/Menu/styled.js +1 -1
  38. package/dist/components/actions/index.js +1 -1
  39. package/dist/components/actions/use-action.js +1 -1
  40. package/dist/components/actions/use-anchored-menu.js +1 -1
  41. package/dist/components/actions/use-context-menu.js +1 -1
  42. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  43. package/dist/components/content/Alert/Alert.js +1 -1
  44. package/dist/components/content/Alert/use-alert.js +1 -1
  45. package/dist/components/content/Avatar/Avatar.js +1 -1
  46. package/dist/components/content/Badge/Badge.js +1 -1
  47. package/dist/components/content/Card/Card.js +1 -1
  48. package/dist/components/content/Content.js +1 -1
  49. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  50. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  51. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  52. package/dist/components/content/Divider.js +1 -1
  53. package/dist/components/content/Footer.js +1 -1
  54. package/dist/components/content/Header.js +1 -1
  55. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  56. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  57. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  58. package/dist/components/content/Item/Item.d.ts +7 -0
  59. package/dist/components/content/Item/Item.js +13 -6
  60. package/dist/components/content/Item/Item.js.map +1 -1
  61. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  62. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  63. package/dist/components/content/Layout/GridLayout.js +1 -1
  64. package/dist/components/content/Layout/Layout.js +1 -1
  65. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  66. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  67. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  68. package/dist/components/content/Layout/LayoutContent.js +1 -1
  69. package/dist/components/content/Layout/LayoutContext.js +1 -1
  70. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  71. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  72. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  73. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutPane.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  76. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  78. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  79. package/dist/components/content/Layout/index.js +1 -1
  80. package/dist/components/content/Layout/utils.js +1 -1
  81. package/dist/components/content/Paragraph.js +1 -1
  82. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  83. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  84. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  85. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  86. package/dist/components/content/Result/Result.js +1 -1
  87. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  88. package/dist/components/content/Tag/Tag.js +1 -1
  89. package/dist/components/content/Text.js +1 -1
  90. package/dist/components/content/TextItem/TextItem.js +1 -1
  91. package/dist/components/content/Title.js +1 -1
  92. package/dist/components/content/Tree/Tree.js +1 -1
  93. package/dist/components/content/Tree/TreeNode.js +1 -1
  94. package/dist/components/content/Tree/styled.js +1 -1
  95. package/dist/components/content/Tree/tree-index.js +1 -1
  96. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  97. package/dist/components/content/Tree/use-load-data.js +1 -1
  98. package/dist/components/content/highlightText.js +1 -1
  99. package/dist/components/content/use-auto-tooltip.js +41 -32
  100. package/dist/components/content/use-auto-tooltip.js.map +1 -1
  101. package/dist/components/data/DataTable/DataTable.js +82 -24
  102. package/dist/components/data/DataTable/DataTable.js.map +1 -1
  103. package/dist/components/data/DataTable/types.d.ts +56 -1
  104. package/dist/components/data/ItemTable/ItemTable.js +13 -5
  105. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  106. package/dist/components/data/ItemTable/ItemTableBulkBar.js +3 -7
  107. package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +1 -1
  108. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  109. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  110. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  111. package/dist/components/data/ItemTable/types.d.ts +19 -0
  112. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  113. package/dist/components/data/TableBase/RowCollection.js +5 -3
  114. package/dist/components/data/TableBase/RowCollection.js.map +1 -1
  115. package/dist/components/data/TableBase/TableHeaderCell.js +115 -0
  116. package/dist/components/data/TableBase/TableHeaderCell.js.map +1 -0
  117. package/dist/components/data/TableBase/TableRow.js +1 -1
  118. package/dist/components/data/TableBase/TableView.js +195 -33
  119. package/dist/components/data/TableBase/TableView.js.map +1 -1
  120. package/dist/components/data/TableBase/column-menu.d.ts +36 -0
  121. package/dist/components/data/TableBase/column-menu.js +104 -0
  122. package/dist/components/data/TableBase/column-menu.js.map +1 -0
  123. package/dist/components/data/TableBase/column-tint.js +168 -0
  124. package/dist/components/data/TableBase/column-tint.js.map +1 -0
  125. package/dist/components/data/TableBase/index.d.ts +3 -2
  126. package/dist/components/data/TableBase/row-menu.js +11 -6
  127. package/dist/components/data/TableBase/row-menu.js.map +1 -1
  128. package/dist/components/data/TableBase/styled.js +45 -16
  129. package/dist/components/data/TableBase/styled.js.map +1 -1
  130. package/dist/components/data/TableBase/types.d.ts +104 -6
  131. package/dist/components/data/TableBase/types.js +1 -1
  132. package/dist/components/data/TableBase/types.js.map +1 -1
  133. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  134. package/dist/components/data/TableBase/use-column-order.js +100 -0
  135. package/dist/components/data/TableBase/use-column-order.js.map +1 -0
  136. package/dist/components/data/TableBase/use-container-width.js +1 -1
  137. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  138. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  139. package/dist/components/data/TableBase/use-table-columns.js +24 -2
  140. package/dist/components/data/TableBase/use-table-columns.js.map +1 -1
  141. package/dist/components/data/TableBase/use-table-search.js +1 -1
  142. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  143. package/dist/components/data/TableBase/use-table-sort.js +20 -1
  144. package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
  145. package/dist/components/data/TableBase/use-table-sorts.js +40 -1
  146. package/dist/components/data/TableBase/use-table-sorts.js.map +1 -1
  147. package/dist/components/data/TableBase/use-table-storage.d.ts +1 -1
  148. package/dist/components/data/TableBase/use-table-storage.js +6 -2
  149. package/dist/components/data/TableBase/use-table-storage.js.map +1 -1
  150. package/dist/components/data/index.d.ts +2 -1
  151. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  152. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  153. package/dist/components/fields/Checkbox/context.js +1 -1
  154. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  155. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  156. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  157. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  158. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  159. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  160. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  161. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  162. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  163. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  164. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  165. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  166. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  167. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  168. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  169. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  170. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  171. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  172. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  173. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  174. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  175. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  176. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  177. package/dist/components/fields/DatePicker/period.js +1 -1
  178. package/dist/components/fields/DatePicker/props.js +1 -1
  179. package/dist/components/fields/DatePicker/utils.js +1 -1
  180. package/dist/components/fields/FileInput/FileInput.js +1 -1
  181. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  182. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  183. package/dist/components/fields/Input/Input.js +1 -1
  184. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  185. package/dist/components/fields/ListBox/ListBox.js +1 -1
  186. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  187. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  188. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  189. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  190. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  191. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  192. package/dist/components/fields/Picker/Picker.js +1 -1
  193. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  194. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  195. package/dist/components/fields/RadioGroup/context.js +1 -1
  196. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  197. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  198. package/dist/components/fields/Select/Select.js +1 -1
  199. package/dist/components/fields/Slider/Gradation.js +1 -1
  200. package/dist/components/fields/Slider/HueSlider.js +1 -1
  201. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  202. package/dist/components/fields/Slider/Slider.js +1 -1
  203. package/dist/components/fields/Slider/SliderBase.js +1 -1
  204. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  205. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  206. package/dist/components/fields/Slider/elements.js +1 -1
  207. package/dist/components/fields/Slider/index.js +1 -1
  208. package/dist/components/fields/Switch/Switch.js +1 -1
  209. package/dist/components/fields/TextArea/TextArea.js +1 -1
  210. package/dist/components/fields/TextInput/TextInput.js +1 -1
  211. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  212. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  213. package/dist/components/fields/color/ColorPanel.js +1 -1
  214. package/dist/components/fields/color/ColorSwatch.js +1 -1
  215. package/dist/components/fields/color/channels.js +1 -1
  216. package/dist/components/fields/color/color.js +1 -1
  217. package/dist/components/fields/color/context.js +1 -1
  218. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  219. package/dist/components/form/Form/Field.js +1 -1
  220. package/dist/components/form/Form/Form.js +1 -1
  221. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  222. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  223. package/dist/components/form/Form/SubmitError.js +1 -1
  224. package/dist/components/form/Form/index.js +1 -1
  225. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  226. package/dist/components/form/Form/use-field/use-field.js +1 -1
  227. package/dist/components/form/Form/use-form.js +1 -1
  228. package/dist/components/form/Form/validation.js +1 -1
  229. package/dist/components/form/Label.js +1 -1
  230. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  231. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  232. package/dist/components/form/validation/use-validation-props.js +1 -1
  233. package/dist/components/form/wrapper.js +1 -1
  234. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  235. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  236. package/dist/components/layout/Board/Board.js +1 -1
  237. package/dist/components/layout/Board/BoardProvider.js +1 -1
  238. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  239. package/dist/components/layout/Board/Widget.js +1 -1
  240. package/dist/components/layout/Board/WidgetHost.js +1 -1
  241. package/dist/components/layout/Board/board-context.js +1 -1
  242. package/dist/components/layout/Board/board-store.js +1 -1
  243. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  244. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  245. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  246. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  247. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  248. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  249. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  250. package/dist/components/layout/Board/index.js +1 -1
  251. package/dist/components/layout/Board/responsive-utils.js +1 -1
  252. package/dist/components/layout/Board/use-board-layout.js +1 -1
  253. package/dist/components/layout/Board/use-board-registry.js +1 -1
  254. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  255. package/dist/components/layout/Board/use-board-selection.js +1 -1
  256. package/dist/components/layout/Flex.js +1 -1
  257. package/dist/components/layout/Flow.js +1 -1
  258. package/dist/components/layout/Grid.js +1 -1
  259. package/dist/components/layout/Panel.js +1 -1
  260. package/dist/components/layout/Prefix.js +1 -1
  261. package/dist/components/layout/ResizablePanel.js +1 -1
  262. package/dist/components/layout/Space.js +1 -1
  263. package/dist/components/layout/Suffix.js +1 -1
  264. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  265. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  266. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  267. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  268. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  269. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  270. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  271. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  272. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  273. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  274. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  275. package/dist/components/navigation/Tabs/styled.js +1 -1
  276. package/dist/components/navigation/Tabs/types.js +1 -1
  277. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  278. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  279. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  280. package/dist/components/other/Calendar/Calendar.js +1 -1
  281. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  282. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  283. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  284. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  285. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  286. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  287. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  288. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  289. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  290. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  291. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  292. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  293. package/dist/components/overlays/Dialog/context.js +1 -1
  294. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  295. package/dist/components/overlays/Modal/Modal.js +1 -1
  296. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  297. package/dist/components/overlays/Modal/Overlay.js +1 -1
  298. package/dist/components/overlays/Modal/Popover.js +1 -1
  299. package/dist/components/overlays/Modal/Tray.js +1 -1
  300. package/dist/components/overlays/Modal/Underlay.js +1 -1
  301. package/dist/components/overlays/Notifications/Notification.js +1 -1
  302. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  303. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  304. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  305. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  306. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  307. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  308. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  309. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  310. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  311. package/dist/components/overlays/Notifications/index.js +1 -1
  312. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  313. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  314. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  315. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  316. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  317. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  318. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  319. package/dist/components/overlays/Toast/index.js +1 -1
  320. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  321. package/dist/components/overlays/Toast/useToast.js +1 -1
  322. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  323. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  324. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  325. package/dist/components/overlays/Tooltip/context.js +1 -1
  326. package/dist/components/portal/Portal.js +1 -1
  327. package/dist/components/portal/PortalProvider.js +1 -1
  328. package/dist/components/portal/usePortal.js +1 -1
  329. package/dist/components/shared/DraggableCollection.js +1 -1
  330. package/dist/components/shared/InvalidIcon.js +1 -1
  331. package/dist/components/shared/ValidIcon.js +1 -1
  332. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  333. package/dist/components/status/Spin/Cube.js +1 -1
  334. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  335. package/dist/components/status/Spin/Spin.js +1 -1
  336. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  337. package/dist/data/item-themes.js +1 -1
  338. package/dist/data/themes.js +1 -1
  339. package/dist/eslint-plugin/defaults.generated.js +13 -1
  340. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  341. package/dist/eslint-plugin/index.js +1 -1
  342. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  343. package/dist/i18n/I18nProvider.js +1 -1
  344. package/dist/i18n/createFormatter.js +1 -1
  345. package/dist/i18n/index.js +1 -1
  346. package/dist/i18n/instance.js +1 -1
  347. package/dist/i18n/locales/de-DE/uikit.js +5 -1
  348. package/dist/i18n/locales/en-US/uikit.js +5 -1
  349. package/dist/i18n/locales/en-US/uikit.json.d.ts +4 -0
  350. package/dist/i18n/locales/es-ES/uikit.js +5 -1
  351. package/dist/i18n/locales/es-MX/uikit.js +5 -1
  352. package/dist/i18n/locales/fr-FR/uikit.js +5 -1
  353. package/dist/i18n/locales/it-IT/uikit.js +5 -1
  354. package/dist/i18n/locales/ja-JP/uikit.js +5 -1
  355. package/dist/i18n/locales/nb-NO/uikit.js +5 -1
  356. package/dist/i18n/locales/pt-BR/uikit.js +5 -1
  357. package/dist/i18n/locales/pt-PT/uikit.js +5 -1
  358. package/dist/i18n/locales/sv-SE/uikit.js +5 -1
  359. package/dist/i18n/locales/vi-VN/uikit.js +5 -1
  360. package/dist/i18n/locales.js +1 -1
  361. package/dist/i18n/useFormatter.js +1 -1
  362. package/dist/i18n/useI18n.js +1 -1
  363. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  364. package/dist/icons/AdjustmentsIcon.js +1 -1
  365. package/dist/icons/AiIcon.js +1 -1
  366. package/dist/icons/AreaChartIcon.js +1 -1
  367. package/dist/icons/ArrowNarrowDownIcon.d.ts +12 -0
  368. package/dist/icons/ArrowNarrowDownIcon.js +11 -0
  369. package/dist/icons/ArrowNarrowDownIcon.js.map +1 -0
  370. package/dist/icons/ArrowNarrowUpIcon.d.ts +12 -0
  371. package/dist/icons/ArrowNarrowUpIcon.js +11 -0
  372. package/dist/icons/ArrowNarrowUpIcon.js.map +1 -0
  373. package/dist/icons/BackwardIcon.js +1 -1
  374. package/dist/icons/BarChartIcon.js +1 -1
  375. package/dist/icons/BellFilledIcon.js +1 -1
  376. package/dist/icons/BellIcon.js +1 -1
  377. package/dist/icons/BooleanIcon.js +1 -1
  378. package/dist/icons/CalendarEditIcon.js +1 -1
  379. package/dist/icons/CalendarIcon.js +1 -1
  380. package/dist/icons/CaretDownIcon.js +1 -1
  381. package/dist/icons/CaretUpIcon.js +1 -1
  382. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  383. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  384. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  385. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  386. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  387. package/dist/icons/ChartBarLineIcon.js +1 -1
  388. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  389. package/dist/icons/ChartBarStackedIcon.js +1 -1
  390. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  391. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  392. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  393. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  394. package/dist/icons/ChartBubbleIcon.js +1 -1
  395. package/dist/icons/ChartDonut2Icon.js +1 -1
  396. package/dist/icons/ChartFunnelIcon.js +1 -1
  397. package/dist/icons/ChartHeatmapIcon.js +1 -1
  398. package/dist/icons/ChartKPIIcon.js +1 -1
  399. package/dist/icons/ChartPie2Icon.js +1 -1
  400. package/dist/icons/ChartScatterIcon.js +1 -1
  401. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  402. package/dist/icons/CheckCircleIcon.js +1 -1
  403. package/dist/icons/CheckIcon.js +1 -1
  404. package/dist/icons/CircleFilledIcon.js +1 -1
  405. package/dist/icons/ClearIcon.js +1 -1
  406. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  407. package/dist/icons/CloseCircleIcon.js +1 -1
  408. package/dist/icons/CloseIcon.js +1 -1
  409. package/dist/icons/CodeIcon.js +1 -1
  410. package/dist/icons/ColumnTotalIcon.js +1 -1
  411. package/dist/icons/CopyIcon.js +1 -1
  412. package/dist/icons/CountIcon.js +1 -1
  413. package/dist/icons/CubeIcon.js +1 -1
  414. package/dist/icons/CubePauseIcon.js +1 -1
  415. package/dist/icons/CubePlayIcon.js +1 -1
  416. package/dist/icons/CurrencyDollarIcon.js +1 -1
  417. package/dist/icons/DangerIcon.js +1 -1
  418. package/dist/icons/DashboardIcon.js +1 -1
  419. package/dist/icons/DatabaseIcon.js +1 -1
  420. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  421. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  422. package/dist/icons/DirectionIcon.js +1 -1
  423. package/dist/icons/DonutIcon.js +1 -1
  424. package/dist/icons/DownIcon.js +1 -1
  425. package/dist/icons/EditIcon.js +1 -1
  426. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  427. package/dist/icons/ExclamationCircleIcon.js +1 -1
  428. package/dist/icons/ExclamationIcon.js +1 -1
  429. package/dist/icons/EyeIcon.js +1 -1
  430. package/dist/icons/EyeInvisibleIcon.js +1 -1
  431. package/dist/icons/FilterIcon.js +1 -1
  432. package/dist/icons/FolderFilledIcon.js +1 -1
  433. package/dist/icons/FolderIcon.js +1 -1
  434. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  435. package/dist/icons/FolderOpenIcon.js +1 -1
  436. package/dist/icons/ForwardIcon.js +1 -1
  437. package/dist/icons/GripVerticalIcon.js +1 -1
  438. package/dist/icons/HierarchyIcon.js +1 -1
  439. package/dist/icons/HierarchyOpenIcon.js +1 -1
  440. package/dist/icons/Icon.js +1 -1
  441. package/dist/icons/InfoCircleIcon.js +1 -1
  442. package/dist/icons/InfoIcon.js +1 -1
  443. package/dist/icons/KeyIcon.js +1 -1
  444. package/dist/icons/LeftIcon.js +1 -1
  445. package/dist/icons/LineChartIcon.js +1 -1
  446. package/dist/icons/LoadingIcon.js +1 -1
  447. package/dist/icons/LockFilledIcon.js +1 -1
  448. package/dist/icons/LockIcon.js +1 -1
  449. package/dist/icons/MoreIcon.js +1 -1
  450. package/dist/icons/NotAllowedIcon.js +1 -1
  451. package/dist/icons/Number123Icon.js +1 -1
  452. package/dist/icons/NumberIcon.js +1 -1
  453. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  454. package/dist/icons/PauseCircleIcon.js +1 -1
  455. package/dist/icons/PauseIcon.js +1 -1
  456. package/dist/icons/PercentageIcon.js +1 -1
  457. package/dist/icons/PieChartIcon.js +1 -1
  458. package/dist/icons/PipetteIcon.js +1 -1
  459. package/dist/icons/PlayCircleIcon.js +1 -1
  460. package/dist/icons/PlayIcon.js +1 -1
  461. package/dist/icons/PlusIcon.js +1 -1
  462. package/dist/icons/ProgressBarIcon.js +1 -1
  463. package/dist/icons/ReloadIcon.js +1 -1
  464. package/dist/icons/ReportIcon.js +1 -1
  465. package/dist/icons/ReturnIcon.js +1 -1
  466. package/dist/icons/RightIcon.js +1 -1
  467. package/dist/icons/RowTotalsIcon.js +1 -1
  468. package/dist/icons/SchemeIcon.js +1 -1
  469. package/dist/icons/SearchIcon.js +1 -1
  470. package/dist/icons/SemanticQueryIcon.js +1 -1
  471. package/dist/icons/SettingsIcon.js +1 -1
  472. package/dist/icons/ShieldFilledIcon.js +1 -1
  473. package/dist/icons/ShieldIcon.js +1 -1
  474. package/dist/icons/SlashIcon.js +1 -1
  475. package/dist/icons/SparklesIcon.js +1 -1
  476. package/dist/icons/SqlIcon.js +1 -1
  477. package/dist/icons/StatsIcon.js +1 -1
  478. package/dist/icons/StopIcon.js +1 -1
  479. package/dist/icons/StringIcon.js +1 -1
  480. package/dist/icons/SubtotalsIcon.js +1 -1
  481. package/dist/icons/SwitchIcon.js +1 -1
  482. package/dist/icons/TableIcon.js +1 -1
  483. package/dist/icons/ThumbsDownIcon.js +1 -1
  484. package/dist/icons/ThumbsUpIcon.js +1 -1
  485. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  486. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  487. package/dist/icons/ThunderboltIcon.js +1 -1
  488. package/dist/icons/TimeIcon.js +1 -1
  489. package/dist/icons/TrashIcon.js +1 -1
  490. package/dist/icons/UnlockIcon.js +1 -1
  491. package/dist/icons/UpIcon.js +1 -1
  492. package/dist/icons/UserGroupIcon.js +1 -1
  493. package/dist/icons/UserIcon.js +1 -1
  494. package/dist/icons/UserLockIcon.js +1 -1
  495. package/dist/icons/ViewIcon.js +1 -1
  496. package/dist/icons/WarningFilledIcon.js +1 -1
  497. package/dist/icons/WarningIcon.js +1 -1
  498. package/dist/icons/index.d.ts +2 -0
  499. package/dist/icons/wrap-icon.js +1 -1
  500. package/dist/index.d.ts +7 -2
  501. package/dist/index.js +7 -2
  502. package/dist/index.js.map +1 -1
  503. package/dist/provider.js +1 -1
  504. package/dist/providers/TrackingProvider.js +1 -1
  505. package/dist/providers/navigationAdapter.default.js +1 -1
  506. package/dist/tokens/base.js +1 -1
  507. package/dist/tokens/color-theme.d.ts +86 -0
  508. package/dist/tokens/color-theme.js +156 -0
  509. package/dist/tokens/color-theme.js.map +1 -0
  510. package/dist/tokens/colors.js +1 -1
  511. package/dist/tokens/index.d.ts +1 -0
  512. package/dist/tokens/index.js +2 -1
  513. package/dist/tokens/index.js.map +1 -1
  514. package/dist/tokens/layout.js +1 -1
  515. package/dist/tokens/lazy-styles.js +1 -1
  516. package/dist/tokens/palette-config.js +2 -2
  517. package/dist/tokens/palette.d.ts +1 -1
  518. package/dist/tokens/palette.js +44 -2
  519. package/dist/tokens/palette.js.map +1 -1
  520. package/dist/tokens/shadows.js +1 -1
  521. package/dist/tokens/sizes.js +1 -1
  522. package/dist/tokens/spacing.js +1 -1
  523. package/dist/tokens/typography.js +1 -1
  524. package/dist/utils/ResizeSensor.js +1 -1
  525. package/dist/utils/index.d.ts +1 -0
  526. package/dist/utils/is-dev-env.js +1 -1
  527. package/dist/utils/modules.js +1 -1
  528. package/dist/utils/promise.js +1 -1
  529. package/dist/utils/raf.js +1 -1
  530. package/dist/utils/random.js +1 -1
  531. package/dist/utils/range.js +1 -1
  532. package/dist/utils/react/RenderCache.js +1 -1
  533. package/dist/utils/react/Slots.js +1 -1
  534. package/dist/utils/react/chain.js +1 -1
  535. package/dist/utils/react/disabledProps.d.ts +49 -0
  536. package/dist/utils/react/disabledProps.js +82 -0
  537. package/dist/utils/react/disabledProps.js.map +1 -0
  538. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  539. package/dist/utils/react/index.d.ts +1 -0
  540. package/dist/utils/react/index.js +2 -1
  541. package/dist/utils/react/interactions.js +1 -1
  542. package/dist/utils/react/isTextOnly.js +1 -1
  543. package/dist/utils/react/mapProps.js +1 -1
  544. package/dist/utils/react/mergeProps.js +1 -1
  545. package/dist/utils/react/nullableValue.js +1 -1
  546. package/dist/utils/react/resolveIcon.js +1 -1
  547. package/dist/utils/react/sharedStore.js +1 -1
  548. package/dist/utils/react/useBufferedValue.js +1 -1
  549. package/dist/utils/react/useCombinedRefs.js +1 -1
  550. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  551. package/dist/utils/react/useEventBus.js +1 -1
  552. package/dist/utils/react/useId.js +1 -1
  553. package/dist/utils/react/useIsDarwin.js +1 -1
  554. package/dist/utils/react/useKeySymbols.js +1 -1
  555. package/dist/utils/react/useLayoutEffect.js +1 -1
  556. package/dist/utils/react/useLocalStorage.js +1 -1
  557. package/dist/utils/react/useMergeStyles.js +1 -1
  558. package/dist/utils/react/usePopoverSync.js +1 -1
  559. package/dist/utils/react/useQaProps.js +1 -1
  560. package/dist/utils/react/useViewportSize.js +1 -1
  561. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  562. package/dist/utils/selection.js +1 -1
  563. package/dist/utils/styles.js +1 -1
  564. package/dist/utils/tree.js +1 -1
  565. package/dist/utils/warnings.js +1 -1
  566. package/dist/version.js +2 -2
  567. package/docs/components/actions/Button.md +17 -0
  568. package/docs/components/content/Item.md +8 -1
  569. package/docs/components/data/DataTable.md +118 -2
  570. package/docs/components/data/ItemTable.md +37 -5
  571. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
+ import { __Menu } from "../../actions/Menu/Menu.js";
3
+ import { normalizeMenuAction } from "./row-menu.js";
4
+ import { Children, cloneElement, isValidElement } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+
7
+ //#region src/components/data/TableBase/column-menu.tsx
8
+ /**
9
+ * Menu keys the table itself honours.
10
+ *
11
+ * Sorting is the only capability the table owns, so it is the only thing that
12
+ * can be a reserved key. `pin` and `hide` deliberately are not: `column.pin` and
13
+ * `column.isHidden` are read-only declarative inputs with no controlled state
14
+ * behind them, and reserving those keys would fix an API in string literals
15
+ * before the state that backs it exists. They stay ordinary consumer keys and
16
+ * are reported through `onColumnMenuAction` like anything else.
17
+ */
18
+ const COLUMN_MENU_SORT_KEYS = [
19
+ "sort-asc",
20
+ "sort-desc",
21
+ "clear-sort"
22
+ ];
23
+ function isColumnMenuSortKey(key) {
24
+ return COLUMN_MENU_SORT_KEYS.includes(key);
25
+ }
26
+ /** The direction a reserved key asks for. `clear-sort` asks for none. */
27
+ const COLUMN_MENU_SORT_DIRECTION = {
28
+ "sort-asc": "asc",
29
+ "sort-desc": "desc",
30
+ "clear-sort": null
31
+ };
32
+ /**
33
+ * Whether a reserved key would do nothing if pressed.
34
+ *
35
+ * Redundancy is signalled by disabling the item rather than by ticking the
36
+ * active one. A tick would mean `isSelected`, which `MenuItem` only honours when
37
+ * the whole `Menu` runs at `selectionMode !== 'none'` (`MenuItem.tsx:43`) — and
38
+ * switching the menu into a selection mode would turn the consumer's own items
39
+ * into radios too, and could be overridden from `menuProps`. Disabling is local
40
+ * to the item and cannot leak.
41
+ */
42
+ function isSortKeyRedundant(key, ctx) {
43
+ if (!ctx.isSortable) return true;
44
+ if (key === "clear-sort") return ctx.sort == null || ctx.disallowSortRemoval;
45
+ return ctx.sort === COLUMN_MENU_SORT_DIRECTION[key];
46
+ }
47
+ /**
48
+ * Fills in default labels and disabled state for the reserved sort keys.
49
+ *
50
+ * `Children.forEach` rather than `Children.toArray`, because `toArray` rewrites
51
+ * every key with a `.$` prefix — which breaks `selectedKeys` matching inside
52
+ * `Menu`. Same reason `TabButton` does it this way.
53
+ *
54
+ * A label or an `isDisabled` the consumer wrote always wins; this only supplies
55
+ * what was left out, so `<Menu.Item key="sort-asc" />` is the short form and
56
+ * `<Menu.Item key="sort-asc">Oldest first</Menu.Item>` still says what it says.
57
+ */
58
+ function processColumnMenuItems(children, ctx) {
59
+ const result = [];
60
+ Children.forEach(children, (child) => {
61
+ if (!isValidElement(child)) {
62
+ result.push(child);
63
+ return;
64
+ }
65
+ const element = child;
66
+ const childProps = element.props;
67
+ const key = element.key == null ? null : normalizeMenuAction(element.key);
68
+ if (key != null && isColumnMenuSortKey(key)) {
69
+ result.push(cloneElement(element, {
70
+ children: childProps.children ?? ctx.labels[key],
71
+ isDisabled: childProps.isDisabled ?? isSortKeyRedundant(key, ctx)
72
+ }));
73
+ return;
74
+ }
75
+ if (childProps.children != null && typeof childProps.children !== "string" && typeof childProps.children !== "number") {
76
+ result.push(cloneElement(element, { children: processColumnMenuItems(childProps.children, ctx) }));
77
+ return;
78
+ }
79
+ result.push(child);
80
+ });
81
+ return result;
82
+ }
83
+ /**
84
+ * The reserved sort items, ready to drop into `header.menu`.
85
+ *
86
+ * ```tsx
87
+ * header: { menu: <>{columnSortMenu()}<Menu.Item key="pin">Pin</Menu.Item></> }
88
+ * ```
89
+ *
90
+ * Exists because `Menu.Item` requires `children` — it comes from react-stately's
91
+ * `ItemProps` — so `<Menu.Item key="sort-asc" />` does not typecheck, and a
92
+ * consumer filling the label in by hand would hardcode one language and lose the
93
+ * translated one the table supplies. Passing `null` satisfies the type and reads
94
+ * as "the table fills this in", which `processColumnMenuItems` then does.
95
+ *
96
+ * Hand-written keys still work — this is a convenience, not the only route.
97
+ */
98
+ function columnSortMenu(keys = COLUMN_MENU_SORT_KEYS) {
99
+ return keys.map((key) => /* @__PURE__ */ jsx(__Menu.Item, { children: null }, key));
100
+ }
101
+
102
+ //#endregion
103
+ export { COLUMN_MENU_SORT_DIRECTION, COLUMN_MENU_SORT_KEYS, columnSortMenu, isColumnMenuSortKey, processColumnMenuItems };
104
+ //# sourceMappingURL=column-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-menu.js","names":["Menu"],"sources":["../../../../src/components/data/TableBase/column-menu.tsx"],"sourcesContent":["import { Children, cloneElement, isValidElement } from 'react';\n\nimport { Menu } from '../../actions/Menu';\n\nimport { normalizeMenuAction } from './row-menu';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport type { CubeTableSortDirection } from './types';\n\n/**\n * Menu keys the table itself honours.\n *\n * Sorting is the only capability the table owns, so it is the only thing that\n * can be a reserved key. `pin` and `hide` deliberately are not: `column.pin` and\n * `column.isHidden` are read-only declarative inputs with no controlled state\n * behind them, and reserving those keys would fix an API in string literals\n * before the state that backs it exists. They stay ordinary consumer keys and\n * are reported through `onColumnMenuAction` like anything else.\n */\nexport const COLUMN_MENU_SORT_KEYS = [\n 'sort-asc',\n 'sort-desc',\n 'clear-sort',\n] as const;\n\nexport type CubeColumnMenuSortKey = (typeof COLUMN_MENU_SORT_KEYS)[number];\n\nexport function isColumnMenuSortKey(key: string): key is CubeColumnMenuSortKey {\n return (COLUMN_MENU_SORT_KEYS as readonly string[]).includes(key);\n}\n\n/** The direction a reserved key asks for. `clear-sort` asks for none. */\nexport const COLUMN_MENU_SORT_DIRECTION: Record<\n CubeColumnMenuSortKey,\n CubeTableSortDirection | null\n> = {\n 'sort-asc': 'asc',\n 'sort-desc': 'desc',\n 'clear-sort': null,\n};\n\nexport interface CubeColumnMenuContext {\n isSortable: boolean;\n /** This column's current direction, or `null` when it is unsorted. */\n sort: CubeTableSortDirection | null;\n disallowSortRemoval: boolean;\n /** Default labels, so `TableView` owns the i18n lookup and this stays pure. */\n labels: Record<CubeColumnMenuSortKey, string>;\n}\n\ninterface MenuItemLikeProps {\n children?: ReactNode;\n isDisabled?: boolean;\n}\n\n/**\n * Whether a reserved key would do nothing if pressed.\n *\n * Redundancy is signalled by disabling the item rather than by ticking the\n * active one. A tick would mean `isSelected`, which `MenuItem` only honours when\n * the whole `Menu` runs at `selectionMode !== 'none'` (`MenuItem.tsx:43`) — and\n * switching the menu into a selection mode would turn the consumer's own items\n * into radios too, and could be overridden from `menuProps`. Disabling is local\n * to the item and cannot leak.\n */\nfunction isSortKeyRedundant(\n key: CubeColumnMenuSortKey,\n ctx: CubeColumnMenuContext,\n): boolean {\n if (!ctx.isSortable) return true;\n\n if (key === 'clear-sort') {\n return ctx.sort == null || ctx.disallowSortRemoval;\n }\n\n return ctx.sort === COLUMN_MENU_SORT_DIRECTION[key];\n}\n\n/**\n * Fills in default labels and disabled state for the reserved sort keys.\n *\n * `Children.forEach` rather than `Children.toArray`, because `toArray` rewrites\n * every key with a `.$` prefix — which breaks `selectedKeys` matching inside\n * `Menu`. Same reason `TabButton` does it this way.\n *\n * A label or an `isDisabled` the consumer wrote always wins; this only supplies\n * what was left out, so `<Menu.Item key=\"sort-asc\" />` is the short form and\n * `<Menu.Item key=\"sort-asc\">Oldest first</Menu.Item>` still says what it says.\n */\nexport function processColumnMenuItems(\n children: ReactNode,\n ctx: CubeColumnMenuContext,\n): ReactNode {\n const result: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n result.push(child);\n\n return;\n }\n\n const element = child as ReactElement<MenuItemLikeProps>;\n const childProps = element.props;\n const key = element.key == null ? null : normalizeMenuAction(element.key);\n\n if (key != null && isColumnMenuSortKey(key)) {\n result.push(\n cloneElement(element, {\n children: childProps.children ?? ctx.labels[key],\n isDisabled: childProps.isDisabled ?? isSortKeyRedundant(key, ctx),\n }),\n );\n\n return;\n }\n\n // A `Menu.Section` holds the items; recurse so a reserved key inside one is\n // still resolved. Guarded on a non-text child so an ordinary item whose\n // label happens to be an element is not walked for no reason.\n if (\n childProps.children != null &&\n typeof childProps.children !== 'string' &&\n typeof childProps.children !== 'number'\n ) {\n result.push(\n cloneElement(element, {\n children: processColumnMenuItems(childProps.children, ctx),\n }),\n );\n\n return;\n }\n\n result.push(child);\n });\n\n // `Children.forEach` preserves order, and each entry keeps the key it was\n // written with — so React still reconciles these by key, not by index.\n return result;\n}\n\n/**\n * The reserved sort items, ready to drop into `header.menu`.\n *\n * ```tsx\n * header: { menu: <>{columnSortMenu()}<Menu.Item key=\"pin\">Pin</Menu.Item></> }\n * ```\n *\n * Exists because `Menu.Item` requires `children` — it comes from react-stately's\n * `ItemProps` — so `<Menu.Item key=\"sort-asc\" />` does not typecheck, and a\n * consumer filling the label in by hand would hardcode one language and lose the\n * translated one the table supplies. Passing `null` satisfies the type and reads\n * as \"the table fills this in\", which `processColumnMenuItems` then does.\n *\n * Hand-written keys still work — this is a convenience, not the only route.\n */\nexport function columnSortMenu(\n keys: readonly CubeColumnMenuSortKey[] = COLUMN_MENU_SORT_KEYS,\n): ReactNode {\n return keys.map((key) => <Menu.Item key={key}>{null}</Menu.Item>);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,MAAa,wBAAwB;CACnC;CACA;CACA;CACD;AAID,SAAgB,oBAAoB,KAA2C;AAC7E,QAAQ,sBAA4C,SAAS,IAAI;;;AAInE,MAAa,6BAGT;CACF,YAAY;CACZ,aAAa;CACb,cAAc;CACf;;;;;;;;;;;AA0BD,SAAS,mBACP,KACA,KACS;AACT,KAAI,CAAC,IAAI,WAAY,QAAO;AAE5B,KAAI,QAAQ,aACV,QAAO,IAAI,QAAQ,QAAQ,IAAI;AAGjC,QAAO,IAAI,SAAS,2BAA2B;;;;;;;;;;;;;AAcjD,SAAgB,uBACd,UACA,KACW;CACX,MAAM,SAAsB,EAAE;AAE9B,UAAS,QAAQ,WAAW,UAAU;AACpC,MAAI,CAAC,eAAe,MAAM,EAAE;AAC1B,UAAO,KAAK,MAAM;AAElB;;EAGF,MAAM,UAAU;EAChB,MAAM,aAAa,QAAQ;EAC3B,MAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,oBAAoB,QAAQ,IAAI;AAEzE,MAAI,OAAO,QAAQ,oBAAoB,IAAI,EAAE;AAC3C,UAAO,KACL,aAAa,SAAS;IACpB,UAAU,WAAW,YAAY,IAAI,OAAO;IAC5C,YAAY,WAAW,cAAc,mBAAmB,KAAK,IAAI;IAClE,CAAC,CACH;AAED;;AAMF,MACE,WAAW,YAAY,QACvB,OAAO,WAAW,aAAa,YAC/B,OAAO,WAAW,aAAa,UAC/B;AACA,UAAO,KACL,aAAa,SAAS,EACpB,UAAU,uBAAuB,WAAW,UAAU,IAAI,EAC3D,CAAC,CACH;AAED;;AAGF,SAAO,KAAK,MAAM;GAClB;AAIF,QAAO;;;;;;;;;;;;;;;;;AAkBT,SAAgB,eACd,OAAyC,uBAC9B;AACX,QAAO,KAAK,KAAK,QAAQ,oBAACA,OAAK,kBAAgB,QAAN,IAAuB,CAAC"}
@@ -0,0 +1,168 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
+ import { getPaletteConfig } from "../../../tokens/palette-config.js";
3
+ import { hashString } from "../../../tokens/color-theme.js";
4
+
5
+ //#region src/components/data/TableBase/column-tint.ts
6
+ const THEMES = new Set([
7
+ "primary",
8
+ "purple",
9
+ "success",
10
+ "danger",
11
+ "warning",
12
+ "note"
13
+ ]);
14
+ const DEFAULT_SCOPE = [
15
+ "header",
16
+ "body",
17
+ "totals"
18
+ ];
19
+ const EMPTY = {
20
+ slots: /* @__PURE__ */ new Map(),
21
+ scopes: /* @__PURE__ */ new Map(),
22
+ configs: [],
23
+ cellStyles: null,
24
+ headerCellStyles: null
25
+ };
26
+ /**
27
+ * A theme name is only a theme name when the palette has one — otherwise the
28
+ * string is a colour. `'note'` is a theme; `'#0ea5e9'` and `'red'` are colours.
29
+ */
30
+ function isThemeName(value) {
31
+ return THEMES.has(value);
32
+ }
33
+ /**
34
+ * The seed for a palette theme, read from the live palette config so a re-seeded
35
+ * `success` hue moves the columns tinted with it.
36
+ *
37
+ * `primary` and `purple` are the brand itself, which is why they read `hue`
38
+ * rather than a `themes` entry — the palette derives them from the brand hue too.
39
+ */
40
+ function themeSeed(theme) {
41
+ const config = getPaletteConfig();
42
+ if (theme === "primary" || theme === "purple") return {
43
+ hue: config.hue,
44
+ saturation: config.saturation
45
+ };
46
+ return config.themes[theme];
47
+ }
48
+ /** Normalizes any spec into a theme config, or `null` for the manual form. */
49
+ function tintConfig(color) {
50
+ if (typeof color === "string") return isThemeName(color) ? themeSeed(color) : { hue: color };
51
+ if ("fill" in color) return null;
52
+ return {
53
+ hue: color.hue,
54
+ saturation: color.saturation
55
+ };
56
+ }
57
+ /**
58
+ * A stable identity for a spec, so two columns asking for the same colour share
59
+ * one slot — and therefore one set of generated rules.
60
+ *
61
+ * For a derived spec that identity is the theme's own content hash, which makes it
62
+ * shared across TABLES as well: the tokens are registered globally under the same
63
+ * name. The manual form has no theme, so it is keyed on its literal values.
64
+ */
65
+ function manualKey(paint) {
66
+ return `raw-${hashString(`${paint.fill}|${paint.fillBand}|${paint.text}|${paint.headerText}`)}`;
67
+ }
68
+ /**
69
+ * Maps a table's columns onto tint slots and the style maps that paint them.
70
+ *
71
+ * Pure. The colour maths lives in `src/tokens/color-theme.ts`; this is only the
72
+ * mapping from columns to `data-tint` values and tasty state maps.
73
+ */
74
+ function buildColumnTints(columns, { resolveTheme }) {
75
+ const tinted = columns.filter((column) => !column.isStructural && column.color != null);
76
+ if (!tinted.length) return EMPTY;
77
+ const slots = /* @__PURE__ */ new Map();
78
+ const scopes = /* @__PURE__ */ new Map();
79
+ const configs = [];
80
+ const paints = /* @__PURE__ */ new Map();
81
+ for (const column of tinted) {
82
+ const color = column.color;
83
+ const config = tintConfig(color);
84
+ let slot;
85
+ let paint;
86
+ if (config) {
87
+ const theme = resolveTheme(config);
88
+ slot = theme.name;
89
+ paint = {
90
+ fill: theme.colors.surface,
91
+ fillBand: theme.colors["surface-2"],
92
+ text: theme.colors["surface-2-text"],
93
+ headerText: theme.colors["surface-2-text-soft"]
94
+ };
95
+ if (!paints.has(slot)) configs.push(config);
96
+ } else {
97
+ const manual = color;
98
+ paint = {
99
+ fill: manual.fill,
100
+ fillBand: manual.fillBand ?? manual.fill,
101
+ text: manual.text ?? "#row-text",
102
+ headerText: manual.text ?? "#row-text"
103
+ };
104
+ slot = manualKey(paint);
105
+ }
106
+ slots.set(column.key, slot);
107
+ scopes.set(column.key, column.colorScope ?? DEFAULT_SCOPE);
108
+ paints.set(slot, paint);
109
+ }
110
+ return {
111
+ slots,
112
+ scopes,
113
+ configs,
114
+ cellStyles: cellTintStyles(paints),
115
+ headerCellStyles: headerTintStyles(paints)
116
+ };
117
+ }
118
+ /**
119
+ * `#cell-base` / `#cell-text` for the body.
120
+ *
121
+ * The band and the pinned-total fill share ONE grouped key rather than two
122
+ * entries with the same value: tasty coalesces entries in a state map that
123
+ * serialize identically, promotes them to the group's maximum priority and
124
+ * negates them against everything below — which would silently turn the plain
125
+ * tint branch into `false`. See `src/components/data/AGENTS.md`.
126
+ */
127
+ function cellTintStyles(paints) {
128
+ const base = { "": "#row-base" };
129
+ const text = { "": "#row-text" };
130
+ for (const [slot, paint] of paints) {
131
+ base[`@own(tint=${slot})`] = paint.fill;
132
+ if (paint.fillBand !== paint.fill) base[`@own(tint=${slot}) & (@own(odd) | @own(pinned))`] = paint.fillBand;
133
+ text[`@own(tint=${slot})`] = paint.text;
134
+ }
135
+ return {
136
+ "#cell-base": base,
137
+ "#cell-text": text
138
+ };
139
+ }
140
+ /**
141
+ * The header takes the deeper band unconditionally, mirroring how the neutral
142
+ * header sits on `#surface-2` rather than `#surface`.
143
+ */
144
+ function headerTintStyles(paints) {
145
+ const base = { "": "#row-base" };
146
+ const text = { "": "#row-text" };
147
+ for (const [slot, paint] of paints) {
148
+ base[`@own(tint=${slot})`] = paint.fillBand;
149
+ text[`@own(tint=${slot})`] = paint.headerText;
150
+ }
151
+ return {
152
+ "#cell-base": base,
153
+ "#cell-text": text
154
+ };
155
+ }
156
+ /**
157
+ * The `data-tint` value for one part of a column, or `undefined` when the column
158
+ * is untinted or its scope excludes that part.
159
+ */
160
+ function tintSlot(tints, columnKey, scope) {
161
+ const slot = tints.slots.get(columnKey);
162
+ if (slot == null) return void 0;
163
+ return tints.scopes.get(columnKey)?.includes(scope) ? slot : void 0;
164
+ }
165
+
166
+ //#endregion
167
+ export { buildColumnTints, tintSlot };
168
+ //# sourceMappingURL=column-tint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-tint.js","names":[],"sources":["../../../../src/components/data/TableBase/column-tint.ts"],"sourcesContent":["import { hashString } from '../../../tokens/color-theme';\nimport { getPaletteConfig } from '../../../tokens/palette-config';\n\nimport type { Styles } from '@tenphi/tasty';\nimport type { ColorThemeConfig } from '../../../tokens/color-theme';\nimport type {\n CubeResolvedColumn,\n CubeTableColumnColor,\n CubeTableColumnColorScope,\n CubeTableColumnTheme,\n} from './types';\n\nconst THEMES = new Set<string>([\n 'primary',\n 'purple',\n 'success',\n 'danger',\n 'warning',\n 'note',\n]);\n\nconst DEFAULT_SCOPE: readonly CubeTableColumnColorScope[] = [\n 'header',\n 'body',\n 'totals',\n];\n\n/** The three paint values a tinted cell needs, as tasty colour strings. */\ninterface TintPaint {\n fill: string;\n fillBand: string;\n text: string;\n /** The header's text — muted, to match an untinted header. */\n headerText: string;\n}\n\nexport interface ColumnTints {\n /** `columnKey` → `data-tint` value. Absent means the column is not tinted. */\n slots: Map<string, string>;\n /** Which scopes each column's tint applies to. */\n scopes: Map<string, readonly CubeTableColumnColorScope[]>;\n /**\n * Theme configs to register with `useColorTheme`, one per distinct derived\n * spec. Empty when every column used the `{ fill, text }` escape hatch.\n */\n configs: ColorThemeConfig[];\n /** Merge into `styles.Cell`. */\n cellStyles: Styles | null;\n /** Merge into `styles.HeaderCell`. */\n headerCellStyles: Styles | null;\n}\n\nconst EMPTY: ColumnTints = {\n slots: new Map(),\n scopes: new Map(),\n configs: [],\n cellStyles: null,\n headerCellStyles: null,\n};\n\n/**\n * A theme name is only a theme name when the palette has one — otherwise the\n * string is a colour. `'note'` is a theme; `'#0ea5e9'` and `'red'` are colours.\n */\nfunction isThemeName(value: string): value is CubeTableColumnTheme {\n return THEMES.has(value);\n}\n\n/**\n * The seed for a palette theme, read from the live palette config so a re-seeded\n * `success` hue moves the columns tinted with it.\n *\n * `primary` and `purple` are the brand itself, which is why they read `hue`\n * rather than a `themes` entry — the palette derives them from the brand hue too.\n */\nfunction themeSeed(theme: CubeTableColumnTheme): {\n hue: number;\n saturation: number;\n} {\n const config = getPaletteConfig();\n\n if (theme === 'primary' || theme === 'purple') {\n return { hue: config.hue, saturation: config.saturation };\n }\n\n return config.themes[theme];\n}\n\n/** Normalizes any spec into a theme config, or `null` for the manual form. */\nexport function tintConfig(\n color: CubeTableColumnColor,\n): ColorThemeConfig | null {\n if (typeof color === 'string') {\n return isThemeName(color) ? themeSeed(color) : { hue: color };\n }\n\n if ('fill' in color) return null;\n\n return { hue: color.hue, saturation: color.saturation };\n}\n\n/**\n * A stable identity for a spec, so two columns asking for the same colour share\n * one slot — and therefore one set of generated rules.\n *\n * For a derived spec that identity is the theme's own content hash, which makes it\n * shared across TABLES as well: the tokens are registered globally under the same\n * name. The manual form has no theme, so it is keyed on its literal values.\n */\nfunction manualKey(paint: TintPaint): string {\n // Hashed, not literal: the values contain `#`, `.` and `|`, none of which\n // survive being interpolated into a tasty `@own(tint=…)` state key.\n return `raw-${hashString(\n `${paint.fill}|${paint.fillBand}|${paint.text}|${paint.headerText}`,\n )}`;\n}\n\nexport interface BuildColumnTintsOptions {\n /**\n * Resolves a derived spec to its theme. Injected rather than imported so the\n * caller — which is a component and can run hooks — owns registration, and so\n * this stays a pure function.\n */\n resolveTheme: (config: ColorThemeConfig) => {\n name: string;\n colors: Record<string, string>;\n };\n}\n\n/**\n * Maps a table's columns onto tint slots and the style maps that paint them.\n *\n * Pure. The colour maths lives in `src/tokens/color-theme.ts`; this is only the\n * mapping from columns to `data-tint` values and tasty state maps.\n */\nexport function buildColumnTints<T>(\n columns: readonly CubeResolvedColumn<T>[],\n { resolveTheme }: BuildColumnTintsOptions,\n): ColumnTints {\n const tinted = columns.filter(\n (column) => !column.isStructural && column.color != null,\n );\n\n if (!tinted.length) return EMPTY;\n\n const slots = new Map<string, string>();\n const scopes = new Map<string, readonly CubeTableColumnColorScope[]>();\n const configs: ColorThemeConfig[] = [];\n const paints = new Map<string, TintPaint>();\n\n for (const column of tinted) {\n const color = column.color as CubeTableColumnColor;\n const config = tintConfig(color);\n let slot: string;\n let paint: TintPaint;\n\n if (config) {\n const theme = resolveTheme(config);\n\n slot = theme.name;\n paint = {\n fill: theme.colors.surface,\n fillBand: theme.colors['surface-2'],\n text: theme.colors['surface-2-text'],\n headerText: theme.colors['surface-2-text-soft'],\n };\n\n if (!paints.has(slot)) configs.push(config);\n } else {\n const manual = color as {\n fill: string;\n fillBand?: string;\n text?: string;\n };\n\n paint = {\n fill: manual.fill,\n // Without a band the column simply does not band — the caller asked for\n // exactly these values, so inventing a second one would be a surprise.\n fillBand: manual.fillBand ?? manual.fill,\n text: manual.text ?? '#row-text',\n // The manual form derives nothing, so the header takes the same text.\n headerText: manual.text ?? '#row-text',\n };\n slot = manualKey(paint);\n }\n\n slots.set(column.key, slot);\n scopes.set(column.key, column.colorScope ?? DEFAULT_SCOPE);\n paints.set(slot, paint);\n }\n\n return {\n slots,\n scopes,\n configs,\n cellStyles: cellTintStyles(paints),\n headerCellStyles: headerTintStyles(paints),\n };\n}\n\n/**\n * `#cell-base` / `#cell-text` for the body.\n *\n * The band and the pinned-total fill share ONE grouped key rather than two\n * entries with the same value: tasty coalesces entries in a state map that\n * serialize identically, promotes them to the group's maximum priority and\n * negates them against everything below — which would silently turn the plain\n * tint branch into `false`. See `src/components/data/AGENTS.md`.\n */\nfunction cellTintStyles(paints: Map<string, TintPaint>): Styles {\n const base: Record<string, string> = { '': '#row-base' };\n const text: Record<string, string> = { '': '#row-text' };\n\n for (const [slot, paint] of paints) {\n base[`@own(tint=${slot})`] = paint.fill;\n // Only worth a rule when it differs; an identical value here is exactly what\n // the coalescing trap eats.\n if (paint.fillBand !== paint.fill) {\n base[`@own(tint=${slot}) & (@own(odd) | @own(pinned))`] = paint.fillBand;\n }\n text[`@own(tint=${slot})`] = paint.text;\n }\n\n return { '#cell-base': base, '#cell-text': text };\n}\n\n/**\n * The header takes the deeper band unconditionally, mirroring how the neutral\n * header sits on `#surface-2` rather than `#surface`.\n */\nfunction headerTintStyles(paints: Map<string, TintPaint>): Styles {\n const base: Record<string, string> = { '': '#row-base' };\n const text: Record<string, string> = { '': '#row-text' };\n\n for (const [slot, paint] of paints) {\n base[`@own(tint=${slot})`] = paint.fillBand;\n text[`@own(tint=${slot})`] = paint.headerText;\n }\n\n return { '#cell-base': base, '#cell-text': text };\n}\n\n/**\n * The `data-tint` value for one part of a column, or `undefined` when the column\n * is untinted or its scope excludes that part.\n */\nexport function tintSlot(\n tints: ColumnTints,\n columnKey: string,\n scope: CubeTableColumnColorScope,\n): string | undefined {\n const slot = tints.slots.get(columnKey);\n\n if (slot == null) return undefined;\n\n return tints.scopes.get(columnKey)?.includes(scope) ? slot : undefined;\n}\n"],"mappings":";;;;;AAYA,MAAM,SAAS,IAAI,IAAY;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,gBAAsD;CAC1D;CACA;CACA;CACD;AA2BD,MAAM,QAAqB;CACzB,uBAAO,IAAI,KAAK;CAChB,wBAAQ,IAAI,KAAK;CACjB,SAAS,EAAE;CACX,YAAY;CACZ,kBAAkB;CACnB;;;;;AAMD,SAAS,YAAY,OAA8C;AACjE,QAAO,OAAO,IAAI,MAAM;;;;;;;;;AAU1B,SAAS,UAAU,OAGjB;CACA,MAAM,SAAS,kBAAkB;AAEjC,KAAI,UAAU,aAAa,UAAU,SACnC,QAAO;EAAE,KAAK,OAAO;EAAK,YAAY,OAAO;EAAY;AAG3D,QAAO,OAAO,OAAO;;;AAIvB,SAAgB,WACd,OACyB;AACzB,KAAI,OAAO,UAAU,SACnB,QAAO,YAAY,MAAM,GAAG,UAAU,MAAM,GAAG,EAAE,KAAK,OAAO;AAG/D,KAAI,UAAU,MAAO,QAAO;AAE5B,QAAO;EAAE,KAAK,MAAM;EAAK,YAAY,MAAM;EAAY;;;;;;;;;;AAWzD,SAAS,UAAU,OAA0B;AAG3C,QAAO,OAAO,WACZ,GAAG,MAAM,KAAK,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,aACxD;;;;;;;;AAqBH,SAAgB,iBACd,SACA,EAAE,gBACW;CACb,MAAM,SAAS,QAAQ,QACpB,WAAW,CAAC,OAAO,gBAAgB,OAAO,SAAS,KACrD;AAED,KAAI,CAAC,OAAO,OAAQ,QAAO;CAE3B,MAAM,wBAAQ,IAAI,KAAqB;CACvC,MAAM,yBAAS,IAAI,KAAmD;CACtE,MAAM,UAA8B,EAAE;CACtC,MAAM,yBAAS,IAAI,KAAwB;AAE3C,MAAK,MAAM,UAAU,QAAQ;EAC3B,MAAM,QAAQ,OAAO;EACrB,MAAM,SAAS,WAAW,MAAM;EAChC,IAAI;EACJ,IAAI;AAEJ,MAAI,QAAQ;GACV,MAAM,QAAQ,aAAa,OAAO;AAElC,UAAO,MAAM;AACb,WAAQ;IACN,MAAM,MAAM,OAAO;IACnB,UAAU,MAAM,OAAO;IACvB,MAAM,MAAM,OAAO;IACnB,YAAY,MAAM,OAAO;IAC1B;AAED,OAAI,CAAC,OAAO,IAAI,KAAK,CAAE,SAAQ,KAAK,OAAO;SACtC;GACL,MAAM,SAAS;AAMf,WAAQ;IACN,MAAM,OAAO;IAGb,UAAU,OAAO,YAAY,OAAO;IACpC,MAAM,OAAO,QAAQ;IAErB,YAAY,OAAO,QAAQ;IAC5B;AACD,UAAO,UAAU,MAAM;;AAGzB,QAAM,IAAI,OAAO,KAAK,KAAK;AAC3B,SAAO,IAAI,OAAO,KAAK,OAAO,cAAc,cAAc;AAC1D,SAAO,IAAI,MAAM,MAAM;;AAGzB,QAAO;EACL;EACA;EACA;EACA,YAAY,eAAe,OAAO;EAClC,kBAAkB,iBAAiB,OAAO;EAC3C;;;;;;;;;;;AAYH,SAAS,eAAe,QAAwC;CAC9D,MAAM,OAA+B,EAAE,IAAI,aAAa;CACxD,MAAM,OAA+B,EAAE,IAAI,aAAa;AAExD,MAAK,MAAM,CAAC,MAAM,UAAU,QAAQ;AAClC,OAAK,aAAa,KAAK,MAAM,MAAM;AAGnC,MAAI,MAAM,aAAa,MAAM,KAC3B,MAAK,aAAa,KAAK,mCAAmC,MAAM;AAElE,OAAK,aAAa,KAAK,MAAM,MAAM;;AAGrC,QAAO;EAAE,cAAc;EAAM,cAAc;EAAM;;;;;;AAOnD,SAAS,iBAAiB,QAAwC;CAChE,MAAM,OAA+B,EAAE,IAAI,aAAa;CACxD,MAAM,OAA+B,EAAE,IAAI,aAAa;AAExD,MAAK,MAAM,CAAC,MAAM,UAAU,QAAQ;AAClC,OAAK,aAAa,KAAK,MAAM,MAAM;AACnC,OAAK,aAAa,KAAK,MAAM,MAAM;;AAGrC,QAAO;EAAE,cAAc;EAAM,cAAc;EAAM;;;;;;AAOnD,SAAgB,SACd,OACA,WACA,OACoB;CACpB,MAAM,OAAO,MAAM,MAAM,IAAI,UAAU;AAEvC,KAAI,QAAQ,KAAM,QAAO;AAEzB,QAAO,MAAM,OAAO,IAAI,UAAU,EAAE,SAAS,MAAM,GAAG,OAAO"}
@@ -1,5 +1,6 @@
1
1
 
2
- import { CubeTableAlign, CubeTableCellContext, CubeTableColumn, CubeTableColumnHeader, CubeTableHeaderContext, CubeTableRowContext, CubeTableRowSection, CubeTableSort, CubeTableSortDirection } from "./types.js";
2
+ import { CubeTableAlign, CubeTableCellContext, CubeTableColumn, CubeTableColumnHeader, CubeTableHeaderContext, CubeTableRowContext, CubeTableRowSection, CubeTableRowSize, CubeTableSort, CubeTableSortDirection } from "./types.js";
3
3
  import { CubeTableRowRenderProps } from "./TableView.js";
4
4
  import "./styled.js";
5
- import "./use-table-columns.js";
5
+ import "./use-table-columns.js";
6
+ import { COLUMN_MENU_SORT_KEYS, CubeColumnMenuSortKey, columnSortMenu } from "./column-menu.js";
@@ -1,5 +1,5 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
2
- import { Children } from "react";
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
+ import { Children, Fragment, isValidElement } from "react";
3
3
 
4
4
  //#region src/components/data/TableBase/row-menu.ts
5
5
  /**
@@ -17,14 +17,19 @@ const ROW_MENU_COLUMN_WIDTH = {
17
17
  xlarge: 52
18
18
  };
19
19
  /**
20
- * Whether a resolved `rowMenu` actually contains anything.
20
+ * Whether a resolved menu actually contains anything.
21
21
  *
22
- * A row whose resolver returns `null` — or an empty fragment — gets no trigger
23
- * at all, rather than one that opens an empty popover.
22
+ * A resolver returning `null` — or an empty fragment — gets no trigger at all,
23
+ * rather than one that opens an empty popover.
24
+ *
25
+ * Fragments are unwrapped rather than counted. `Children.toArray` drops nullish
26
+ * and boolean children but keeps a fragment as a single node, so
27
+ * `<>{canPin && <Menu.Item/>}</>` read as one item even with nothing in it — and
28
+ * a menu assembled from conditions is the common case, not the exotic one.
24
29
  */
25
30
  function isMenuEmpty(menu) {
26
31
  if (menu == null || menu === false) return true;
27
- return Children.toArray(menu).length === 0;
32
+ return Children.toArray(menu).every((child) => isValidElement(child) && child.type === Fragment && isMenuEmpty(child.props.children));
28
33
  }
29
34
  /**
30
35
  * Strips the `.$` prefix React adds to keys when children pass through
@@ -1 +1 @@
1
- {"version":3,"file":"row-menu.js","names":[],"sources":["../../../../src/components/data/TableBase/row-menu.ts"],"sourcesContent":["import { Children } from 'react';\n\nimport type { ReactNode } from 'react';\n\n/**\n * Reserved key for the `⋮` trigger column. Prefixed so it cannot collide with\n * a real data key, and structural so the value pipeline, sorting and search all\n * skip it.\n */\nexport const ROW_MENU_COLUMN_KEY = '__cube-row-menu__';\n\n/** Wide enough for one `ItemAction`, with no content width to spare. */\nexport const ROW_MENU_COLUMN_WIDTH: Record<string, number> = {\n xsmall: 32,\n small: 36,\n medium: 44,\n large: 48,\n xlarge: 52,\n};\n\n/**\n * Whether a resolved `rowMenu` actually contains anything.\n *\n * A row whose resolver returns `null` — or an empty fragment — gets no trigger\n * at all, rather than one that opens an empty popover.\n */\nexport function isMenuEmpty(menu: ReactNode): boolean {\n if (menu == null || menu === false) return true;\n\n return Children.toArray(menu).length === 0;\n}\n\n/**\n * Strips the `.$` prefix React adds to keys when children pass through\n * `Children.toArray`, so the consumer sees the key it wrote on `Menu.Item`.\n */\nexport function normalizeMenuAction(action: unknown): string {\n const value = String(action);\n\n return value.startsWith('.$') ? value.slice(2) : value;\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,sBAAsB;;AAGnC,MAAa,wBAAgD;CAC3D,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACT;;;;;;;AAQD,SAAgB,YAAY,MAA0B;AACpD,KAAI,QAAQ,QAAQ,SAAS,MAAO,QAAO;AAE3C,QAAO,SAAS,QAAQ,KAAK,CAAC,WAAW;;;;;;AAO3C,SAAgB,oBAAoB,QAAyB;CAC3D,MAAM,QAAQ,OAAO,OAAO;AAE5B,QAAO,MAAM,WAAW,KAAK,GAAG,MAAM,MAAM,EAAE,GAAG"}
1
+ {"version":3,"file":"row-menu.js","names":[],"sources":["../../../../src/components/data/TableBase/row-menu.ts"],"sourcesContent":["import { Children, Fragment, isValidElement } from 'react';\n\nimport type { ReactNode } from 'react';\n\n/**\n * Reserved key for the `⋮` trigger column. Prefixed so it cannot collide with\n * a real data key, and structural so the value pipeline, sorting and search all\n * skip it.\n */\nexport const ROW_MENU_COLUMN_KEY = '__cube-row-menu__';\n\n/** Wide enough for one `ItemAction`, with no content width to spare. */\nexport const ROW_MENU_COLUMN_WIDTH: Record<string, number> = {\n xsmall: 32,\n small: 36,\n medium: 44,\n large: 48,\n xlarge: 52,\n};\n\n/**\n * Whether a resolved menu actually contains anything.\n *\n * A resolver returning `null` — or an empty fragment — gets no trigger at all,\n * rather than one that opens an empty popover.\n *\n * Fragments are unwrapped rather than counted. `Children.toArray` drops nullish\n * and boolean children but keeps a fragment as a single node, so\n * `<>{canPin && <Menu.Item/>}</>` read as one item even with nothing in it — and\n * a menu assembled from conditions is the common case, not the exotic one.\n */\nexport function isMenuEmpty(menu: ReactNode): boolean {\n if (menu == null || menu === false) return true;\n\n // `every` on an empty array is `true`, which is the base case: nothing left\n // after `toArray` pruned the nullish children means nothing to show.\n return Children.toArray(menu).every(\n (child) =>\n isValidElement(child) &&\n child.type === Fragment &&\n isMenuEmpty((child.props as { children?: ReactNode }).children),\n );\n}\n\n/**\n * Strips the `.$` prefix React adds to keys when children pass through\n * `Children.toArray`, so the consumer sees the key it wrote on `Menu.Item`.\n */\nexport function normalizeMenuAction(action: unknown): string {\n const value = String(action);\n\n return value.startsWith('.$') ? value.slice(2) : value;\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,sBAAsB;;AAGnC,MAAa,wBAAgD;CAC3D,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACT;;;;;;;;;;;;AAaD,SAAgB,YAAY,MAA0B;AACpD,KAAI,QAAQ,QAAQ,SAAS,MAAO,QAAO;AAI3C,QAAO,SAAS,QAAQ,KAAK,CAAC,OAC3B,UACC,eAAe,MAAM,IACrB,MAAM,SAAS,YACf,YAAa,MAAM,MAAmC,SAAS,CAClE;;;;;;AAOH,SAAgB,oBAAoB,QAAyB;CAC3D,MAAM,QAAQ,OAAO,OAAO;AAE5B,QAAO,MAAM,WAAW,KAAK,GAAG,MAAM,MAAM,EAAE,GAAG"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.158.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
2
2
  import { _Item } from "../../content/Item/Item.js";
3
3
  import { keyframes, tasty } from "@tenphi/tasty";
4
4
 
@@ -49,11 +49,13 @@ const CELL_STYLES = {
49
49
  "": "$cell-padding-x",
50
50
  "@own(kind=selection) | @own(kind=actions)": 0
51
51
  },
52
+ "#cell-base": "#row-base",
53
+ "#cell-text": "#row-text",
52
54
  fill: {
53
- "": "#row-base #row-overlay",
54
- "@own(cell-selected)": "#row-base #purple.10"
55
+ "": "#cell-base #row-overlay",
56
+ "@own(cell-selected)": "#cell-base #purple.10"
55
57
  },
56
- color: "#row-text",
58
+ color: "#cell-text",
57
59
  opacity: "$dim",
58
60
  position: {
59
61
  "": "static",
@@ -123,6 +125,8 @@ const TableElement = tasty({
123
125
  "#row-base": "#surface",
124
126
  "#row-overlay": "#clear",
125
127
  "#row-text": "#surface-text",
128
+ "#cell-base": "#row-base",
129
+ "#cell-text": "#row-text",
126
130
  display: "grid",
127
131
  gridRows: "max-content minmax(0, 1fr) max-content",
128
132
  gridColumns: "minmax(0, 1fr)",
@@ -145,6 +149,7 @@ const TableElement = tasty({
145
149
  gridRow: 2,
146
150
  position: "relative",
147
151
  overflow: "auto",
152
+ outline: "none",
148
153
  scrollbar: "thin stable",
149
154
  userSelect: {
150
155
  "": "auto",
@@ -165,8 +170,8 @@ const TableElement = tasty({
165
170
  },
166
171
  maskImage: {
167
172
  "": "none",
168
- stale: "linear-gradient(90deg, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 35%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,1) 65%, rgba(0,0,0,1) 100%)",
169
- "@media(prefers-reduced-motion)": "linear-gradient(90deg, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 100%)"
173
+ stale: "linear-gradient(90deg, #black 0%, #black 35%, #black.4 50%, #black 65%, #black 100%)",
174
+ "@media(prefers-reduced-motion)": "linear-gradient(90deg, #black 0%, #black 100%)"
170
175
  },
171
176
  maskSize: "300% 100%",
172
177
  animation: {
@@ -217,12 +222,18 @@ const TableElement = tasty({
217
222
  "@own(pin=start | pin=end)": 3
218
223
  },
219
224
  fill: {
220
- "": "#row-base #row-overlay",
221
- "@own(sortable) & @own(:hover)": "#row-base #surface-text.04"
225
+ "": "#cell-base #row-overlay",
226
+ "(@own(sortable) & @own(:hover)) | @own(menu-open)": "#cell-base #surface-text.04"
222
227
  },
223
228
  cursor: {
224
229
  "": "default",
225
- "@own(sortable)": "pointer"
230
+ "@own(sortable)": "pointer",
231
+ "@own(draggable) & !@own(sortable)": "grab",
232
+ "@own(dragging)": "grabbing"
233
+ },
234
+ opacity: {
235
+ "": 1,
236
+ "@own(dragging)": .4
226
237
  },
227
238
  userSelect: "none",
228
239
  position: {
@@ -233,6 +244,10 @@ const TableElement = tasty({
233
244
  "": "hidden",
234
245
  "@own(resizable)": "visible"
235
246
  },
247
+ "$sort-hint": {
248
+ "": 0,
249
+ "@own(sortable) & (@own(:hover) | @own(:focus-visible))": .4
250
+ },
236
251
  "$resizer-offset": {
237
252
  "": "-.5x",
238
253
  "@own(last-column)": "0px"
@@ -274,6 +289,24 @@ const TableElement = tasty({
274
289
  fill: "#resizer-line",
275
290
  transition: "theme"
276
291
  },
292
+ ColumnDropIndicator: {
293
+ $: "> Scroller > Table > Head > HeadRow > HeaderCell >",
294
+ position: "absolute",
295
+ top: 0,
296
+ bottom: 0,
297
+ width: "2bw",
298
+ insetInlineStart: {
299
+ "": "auto",
300
+ "@own(position=before)": 0
301
+ },
302
+ insetInlineEnd: {
303
+ "": "auto",
304
+ "@own(position=after)": 0
305
+ },
306
+ fill: "#purple",
307
+ radius: "1r",
308
+ zIndex: 4
309
+ },
277
310
  RowLink: {
278
311
  $: "> Scroller > Table > Body > Row > Cell >",
279
312
  position: "absolute",
@@ -346,14 +379,10 @@ const TableElement = tasty({
346
379
  height: "2x",
347
380
  color: "#surface-text",
348
381
  opacity: {
349
- "": 0,
382
+ "": "$sort-hint",
350
383
  "@own(sorted)": 1
351
384
  },
352
- scale: {
353
- "": "1 1",
354
- "@own(dir=desc)": "1 -1"
355
- },
356
- transition: "opacity, scale"
385
+ transition: "opacity"
357
386
  },
358
387
  Body: { $: "> Scroller > Table >" },
359
388
  Row: {
@@ -425,7 +454,7 @@ const TableElement = tasty({
425
454
  "@own(link)": 600
426
455
  },
427
456
  color: {
428
- "": "#row-text",
457
+ "": "#cell-text",
429
458
  "@own(link)": "#purple-text"
430
459
  },
431
460
  textDecoration: {