@cube-dev/ui-kit 0.164.0 → 0.166.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 (583) hide show
  1. package/dist/CHANGELOG.md +32 -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 +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  28. package/dist/components/actions/Link/Link.js +1 -1
  29. package/dist/components/actions/Menu/Menu.js +1 -1
  30. package/dist/components/actions/Menu/MenuItem.js +1 -1
  31. package/dist/components/actions/Menu/MenuSection.js +1 -1
  32. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  35. package/dist/components/actions/Menu/context.js +1 -1
  36. package/dist/components/actions/Menu/styled.js +1 -1
  37. package/dist/components/actions/index.js +1 -1
  38. package/dist/components/actions/use-action.js +1 -1
  39. package/dist/components/actions/use-anchored-menu.js +1 -1
  40. package/dist/components/actions/use-context-menu.js +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  56. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  57. package/dist/components/content/Item/Item.js +1 -1
  58. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  59. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  60. package/dist/components/content/Layout/GridLayout.js +1 -1
  61. package/dist/components/content/Layout/Layout.js +1 -1
  62. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  63. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  64. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  65. package/dist/components/content/Layout/LayoutContent.js +1 -1
  66. package/dist/components/content/Layout/LayoutContext.js +1 -1
  67. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  68. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  69. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  70. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  71. package/dist/components/content/Layout/LayoutPane.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  75. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  76. package/dist/components/content/Layout/index.js +1 -1
  77. package/dist/components/content/Layout/utils.js +1 -1
  78. package/dist/components/content/Paragraph.js +1 -1
  79. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  80. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  81. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  82. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  83. package/dist/components/content/Result/Result.js +1 -1
  84. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  85. package/dist/components/content/Tag/Tag.js +1 -1
  86. package/dist/components/content/Text.d.ts +28 -28
  87. package/dist/components/content/Text.js +1 -1
  88. package/dist/components/content/TextItem/TextItem.js +1 -1
  89. package/dist/components/content/Title.js +1 -1
  90. package/dist/components/content/Tree/Tree.js +1 -1
  91. package/dist/components/content/Tree/TreeNode.js +1 -1
  92. package/dist/components/content/Tree/styled.js +1 -1
  93. package/dist/components/content/Tree/tree-index.js +1 -1
  94. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  95. package/dist/components/content/Tree/use-load-data.js +1 -1
  96. package/dist/components/content/highlightText.js +1 -1
  97. package/dist/components/content/use-auto-tooltip.js +1 -1
  98. package/dist/components/data/DataTable/DataTable.js +140 -21
  99. package/dist/components/data/DataTable/DataTable.js.map +1 -1
  100. package/dist/components/data/DataTable/index.d.ts +1 -1
  101. package/dist/components/data/DataTable/types.d.ts +19 -4
  102. package/dist/components/data/ItemTable/ItemTable.js +169 -25
  103. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  104. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  106. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  107. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  108. package/dist/components/data/ItemTable/types.d.ts +7 -2
  109. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  110. package/dist/components/data/TableBase/RowCollection.js +1 -1
  111. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  112. package/dist/components/data/TableBase/TableRow.js +30 -5
  113. package/dist/components/data/TableBase/TableRow.js.map +1 -1
  114. package/dist/components/data/TableBase/TableView.d.ts +2 -1
  115. package/dist/components/data/TableBase/TableView.js +299 -75
  116. package/dist/components/data/TableBase/TableView.js.map +1 -1
  117. package/dist/components/data/TableBase/column-menu.js +1 -1
  118. package/dist/components/data/TableBase/column-tint.js +1 -1
  119. package/dist/components/data/TableBase/index.d.ts +1 -1
  120. package/dist/components/data/TableBase/row-menu.js +1 -1
  121. package/dist/components/data/TableBase/styled.js +75 -2
  122. package/dist/components/data/TableBase/styled.js.map +1 -1
  123. package/dist/components/data/TableBase/table-tree.js +129 -0
  124. package/dist/components/data/TableBase/table-tree.js.map +1 -0
  125. package/dist/components/data/TableBase/types.d.ts +46 -1
  126. package/dist/components/data/TableBase/types.js +1 -1
  127. package/dist/components/data/TableBase/types.js.map +1 -1
  128. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  129. package/dist/components/data/TableBase/use-column-order.js +1 -1
  130. package/dist/components/data/TableBase/use-container-width.js +1 -1
  131. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  132. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  133. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  134. package/dist/components/data/TableBase/use-table-search.js +4 -4
  135. package/dist/components/data/TableBase/use-table-search.js.map +1 -1
  136. package/dist/components/data/TableBase/use-table-selection.js +124 -24
  137. package/dist/components/data/TableBase/use-table-selection.js.map +1 -1
  138. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  139. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  140. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  141. package/dist/components/data/TableBase/use-table-tree-state.js +107 -0
  142. package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -0
  143. package/dist/components/data/index.d.ts +2 -2
  144. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  145. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  146. package/dist/components/fields/Checkbox/context.js +1 -1
  147. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  148. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  149. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  150. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  151. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  152. package/dist/components/fields/CommandTextArea/CommandTextArea.js +8 -25
  153. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
  154. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  155. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  156. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  157. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  158. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  159. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  160. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  161. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  162. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  163. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  164. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  165. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  166. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  167. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  168. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  169. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  170. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  171. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  172. package/dist/components/fields/DatePicker/period.js +1 -1
  173. package/dist/components/fields/DatePicker/props.js +1 -1
  174. package/dist/components/fields/DatePicker/utils.js +1 -1
  175. package/dist/components/fields/FileInput/FileInput.js +1 -1
  176. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  177. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  178. package/dist/components/fields/Input/Input.js +1 -1
  179. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  180. package/dist/components/fields/ListBox/ListBox.js +1 -1
  181. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  182. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  183. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  184. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  185. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  186. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  187. package/dist/components/fields/Picker/Picker.js +1 -1
  188. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  189. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  190. package/dist/components/fields/RadioGroup/context.js +1 -1
  191. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  192. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  193. package/dist/components/fields/Select/Select.js +1 -1
  194. package/dist/components/fields/Slider/Gradation.js +1 -1
  195. package/dist/components/fields/Slider/HueSlider.js +1 -1
  196. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  197. package/dist/components/fields/Slider/Slider.js +1 -1
  198. package/dist/components/fields/Slider/SliderBase.js +1 -1
  199. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  200. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  201. package/dist/components/fields/Slider/elements.js +1 -1
  202. package/dist/components/fields/Slider/index.js +1 -1
  203. package/dist/components/fields/Switch/Switch.js +1 -1
  204. package/dist/components/fields/TextArea/TextArea.js +10 -29
  205. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  206. package/dist/components/fields/TextInput/TextInput.js +1 -1
  207. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  208. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +146 -0
  209. package/dist/components/fields/TextInput/useAutoSizeTextArea.js.map +1 -0
  210. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  211. package/dist/components/fields/color/ColorPanel.js +1 -1
  212. package/dist/components/fields/color/channels.js +1 -1
  213. package/dist/components/fields/color/color.js +1 -1
  214. package/dist/components/fields/color/context.js +1 -1
  215. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  216. package/dist/components/form/Form/Field.js +1 -1
  217. package/dist/components/form/Form/Form.js +1 -1
  218. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  219. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  220. package/dist/components/form/Form/SubmitError.js +1 -1
  221. package/dist/components/form/Form/index.js +1 -1
  222. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  223. package/dist/components/form/Form/use-field/use-field.js +1 -1
  224. package/dist/components/form/Form/use-form.js +1 -1
  225. package/dist/components/form/Form/validation.js +1 -1
  226. package/dist/components/form/Label.js +1 -1
  227. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  228. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  229. package/dist/components/form/validation/use-validation-props.js +1 -1
  230. package/dist/components/form/wrapper.js +1 -1
  231. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  232. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  233. package/dist/components/layout/Board/Board.d.ts +30 -7
  234. package/dist/components/layout/Board/Board.js +16 -6
  235. package/dist/components/layout/Board/Board.js.map +1 -1
  236. package/dist/components/layout/Board/BoardProvider.js +1 -1
  237. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  238. package/dist/components/layout/Board/Widget.d.ts +9 -0
  239. package/dist/components/layout/Board/Widget.js +3 -2
  240. package/dist/components/layout/Board/Widget.js.map +1 -1
  241. package/dist/components/layout/Board/WidgetHost.js +4 -3
  242. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  243. package/dist/components/layout/Board/board-context.js +1 -1
  244. package/dist/components/layout/Board/board-store.js +2 -2
  245. package/dist/components/layout/Board/board-store.js.map +1 -1
  246. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  247. package/dist/components/layout/Board/grid-core/collision-modes.js +7 -4
  248. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -1
  249. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  250. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  251. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  252. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  253. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  254. package/dist/components/layout/Board/grid-core/placement.d.ts +58 -0
  255. package/dist/components/layout/Board/grid-core/placement.js +153 -0
  256. package/dist/components/layout/Board/grid-core/placement.js.map +1 -0
  257. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  258. package/dist/components/layout/Board/grid-core/types.d.ts +6 -4
  259. package/dist/components/layout/Board/index.d.ts +1 -0
  260. package/dist/components/layout/Board/index.js +2 -1
  261. package/dist/components/layout/Board/index.js.map +1 -1
  262. package/dist/components/layout/Board/responsive-utils.js +1 -1
  263. package/dist/components/layout/Board/use-board-layout.js +1 -1
  264. package/dist/components/layout/Board/use-board-registry.js +91 -100
  265. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  266. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  267. package/dist/components/layout/Board/use-board-selection.js +1 -1
  268. package/dist/components/layout/Flex.js +1 -1
  269. package/dist/components/layout/Flow.js +1 -1
  270. package/dist/components/layout/Grid.js +1 -1
  271. package/dist/components/layout/Panel.js +1 -1
  272. package/dist/components/layout/Prefix.js +1 -1
  273. package/dist/components/layout/ResizablePanel.js +1 -1
  274. package/dist/components/layout/Space.js +1 -1
  275. package/dist/components/layout/Suffix.js +1 -1
  276. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  277. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  278. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  279. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  280. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  281. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  282. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  283. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  284. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  285. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  286. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  287. package/dist/components/navigation/Tabs/styled.js +1 -1
  288. package/dist/components/navigation/Tabs/types.js +1 -1
  289. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  290. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  291. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  292. package/dist/components/other/Calendar/Calendar.js +1 -1
  293. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  294. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  295. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  296. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  297. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  298. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  299. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  300. package/dist/components/other/Calendar/styled.js +1 -1
  301. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  302. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  303. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  304. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  305. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  306. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  307. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  308. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  309. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  310. package/dist/components/overlays/Dialog/context.js +1 -1
  311. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  312. package/dist/components/overlays/Modal/Modal.js +1 -1
  313. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  314. package/dist/components/overlays/Modal/Overlay.js +1 -1
  315. package/dist/components/overlays/Modal/Popover.js +1 -1
  316. package/dist/components/overlays/Modal/Tray.js +1 -1
  317. package/dist/components/overlays/Modal/Underlay.js +1 -1
  318. package/dist/components/overlays/Notifications/Notification.js +1 -1
  319. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  320. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  321. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  322. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  323. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  324. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  325. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  326. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  327. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  328. package/dist/components/overlays/Notifications/index.js +1 -1
  329. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  330. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  331. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  332. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  333. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  334. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  335. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  336. package/dist/components/overlays/Toast/index.js +1 -1
  337. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  338. package/dist/components/overlays/Toast/useToast.js +1 -1
  339. package/dist/components/overlays/Tooltip/Tooltip.js +2 -1
  340. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  341. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  342. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  343. package/dist/components/overlays/Tooltip/context.js +1 -1
  344. package/dist/components/portal/Portal.js +1 -1
  345. package/dist/components/portal/PortalProvider.js +1 -1
  346. package/dist/components/portal/usePortal.js +1 -1
  347. package/dist/components/shared/DraggableCollection.js +1 -1
  348. package/dist/components/shared/InvalidIcon.js +1 -1
  349. package/dist/components/shared/ValidIcon.js +1 -1
  350. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  351. package/dist/components/status/Spin/Cube.js +1 -1
  352. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  353. package/dist/components/status/Spin/Spin.js +1 -1
  354. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  355. package/dist/data/item-themes.js +1 -1
  356. package/dist/data/themes.js +1 -1
  357. package/dist/eslint-plugin/defaults.generated.js +17 -1
  358. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  359. package/dist/eslint-plugin/index.js +1 -1
  360. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  361. package/dist/i18n/I18nProvider.js +1 -1
  362. package/dist/i18n/createFormatter.js +1 -1
  363. package/dist/i18n/index.js +1 -1
  364. package/dist/i18n/instance.js +1 -1
  365. package/dist/i18n/locales/de-DE/uikit.js +2 -1
  366. package/dist/i18n/locales/en-US/uikit.js +2 -1
  367. package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -0
  368. package/dist/i18n/locales/es-ES/uikit.js +2 -1
  369. package/dist/i18n/locales/es-MX/uikit.js +2 -1
  370. package/dist/i18n/locales/fr-FR/uikit.js +2 -1
  371. package/dist/i18n/locales/it-IT/uikit.js +2 -1
  372. package/dist/i18n/locales/ja-JP/uikit.js +2 -1
  373. package/dist/i18n/locales/nb-NO/uikit.js +2 -1
  374. package/dist/i18n/locales/pt-BR/uikit.js +2 -1
  375. package/dist/i18n/locales/pt-PT/uikit.js +2 -1
  376. package/dist/i18n/locales/sv-SE/uikit.js +2 -1
  377. package/dist/i18n/locales/vi-VN/uikit.js +2 -1
  378. package/dist/i18n/locales.js +1 -1
  379. package/dist/i18n/useFormatter.js +1 -1
  380. package/dist/i18n/useI18n.js +1 -1
  381. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  382. package/dist/icons/AdjustmentsIcon.js +1 -1
  383. package/dist/icons/AiIcon.js +1 -1
  384. package/dist/icons/AreaChartIcon.js +1 -1
  385. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  386. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  387. package/dist/icons/BackwardIcon.js +1 -1
  388. package/dist/icons/BarChartIcon.js +1 -1
  389. package/dist/icons/BellFilledIcon.js +1 -1
  390. package/dist/icons/BellIcon.js +1 -1
  391. package/dist/icons/BooleanIcon.js +1 -1
  392. package/dist/icons/CalendarEditIcon.js +1 -1
  393. package/dist/icons/CalendarIcon.js +1 -1
  394. package/dist/icons/CaretDownIcon.js +1 -1
  395. package/dist/icons/CaretUpIcon.js +1 -1
  396. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  397. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  398. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  399. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  400. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  401. package/dist/icons/ChartBarLineIcon.js +1 -1
  402. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  403. package/dist/icons/ChartBarStackedIcon.js +1 -1
  404. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  405. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  406. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  407. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  408. package/dist/icons/ChartBubbleIcon.js +1 -1
  409. package/dist/icons/ChartDonut2Icon.js +1 -1
  410. package/dist/icons/ChartFunnelIcon.js +1 -1
  411. package/dist/icons/ChartHeatmapIcon.js +1 -1
  412. package/dist/icons/ChartKPIIcon.js +1 -1
  413. package/dist/icons/ChartPie2Icon.js +1 -1
  414. package/dist/icons/ChartScatterIcon.js +1 -1
  415. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  416. package/dist/icons/CheckCircleIcon.js +1 -1
  417. package/dist/icons/CheckIcon.js +1 -1
  418. package/dist/icons/CircleFilledIcon.js +1 -1
  419. package/dist/icons/ClearIcon.js +1 -1
  420. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  421. package/dist/icons/CloseCircleIcon.js +1 -1
  422. package/dist/icons/CloseIcon.js +1 -1
  423. package/dist/icons/CodeIcon.js +1 -1
  424. package/dist/icons/ColumnTotalIcon.js +1 -1
  425. package/dist/icons/CopyIcon.js +1 -1
  426. package/dist/icons/CountIcon.js +1 -1
  427. package/dist/icons/CubeIcon.js +1 -1
  428. package/dist/icons/CubePauseIcon.js +1 -1
  429. package/dist/icons/CubePlayIcon.js +1 -1
  430. package/dist/icons/CurrencyDollarIcon.js +1 -1
  431. package/dist/icons/DangerIcon.js +1 -1
  432. package/dist/icons/DashboardIcon.js +1 -1
  433. package/dist/icons/DatabaseIcon.js +1 -1
  434. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  435. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  436. package/dist/icons/DirectionIcon.js +1 -1
  437. package/dist/icons/DonutIcon.js +1 -1
  438. package/dist/icons/DownIcon.js +1 -1
  439. package/dist/icons/EditIcon.js +1 -1
  440. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  441. package/dist/icons/ExclamationCircleIcon.js +1 -1
  442. package/dist/icons/ExclamationIcon.js +1 -1
  443. package/dist/icons/EyeIcon.js +1 -1
  444. package/dist/icons/EyeInvisibleIcon.js +1 -1
  445. package/dist/icons/FilterIcon.js +1 -1
  446. package/dist/icons/FolderFilledIcon.js +1 -1
  447. package/dist/icons/FolderIcon.js +1 -1
  448. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  449. package/dist/icons/FolderOpenIcon.js +1 -1
  450. package/dist/icons/ForwardIcon.js +1 -1
  451. package/dist/icons/GripVerticalIcon.js +1 -1
  452. package/dist/icons/HierarchyIcon.js +1 -1
  453. package/dist/icons/HierarchyOpenIcon.js +1 -1
  454. package/dist/icons/Icon.js +1 -1
  455. package/dist/icons/InfoCircleIcon.js +1 -1
  456. package/dist/icons/InfoIcon.js +1 -1
  457. package/dist/icons/KeyIcon.js +1 -1
  458. package/dist/icons/LeftIcon.js +1 -1
  459. package/dist/icons/LineChartIcon.js +1 -1
  460. package/dist/icons/LoadingIcon.js +1 -1
  461. package/dist/icons/LockFilledIcon.js +1 -1
  462. package/dist/icons/LockIcon.js +1 -1
  463. package/dist/icons/MoreIcon.js +1 -1
  464. package/dist/icons/NotAllowedIcon.js +1 -1
  465. package/dist/icons/Number123Icon.js +1 -1
  466. package/dist/icons/NumberIcon.js +1 -1
  467. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  468. package/dist/icons/PauseCircleIcon.js +1 -1
  469. package/dist/icons/PauseIcon.js +1 -1
  470. package/dist/icons/PercentageIcon.js +1 -1
  471. package/dist/icons/PieChartIcon.js +1 -1
  472. package/dist/icons/PipetteIcon.js +1 -1
  473. package/dist/icons/PlayCircleIcon.js +1 -1
  474. package/dist/icons/PlayIcon.js +1 -1
  475. package/dist/icons/PlusIcon.js +1 -1
  476. package/dist/icons/ProgressBarIcon.js +1 -1
  477. package/dist/icons/ReloadIcon.js +1 -1
  478. package/dist/icons/ReportIcon.js +1 -1
  479. package/dist/icons/ReturnIcon.js +1 -1
  480. package/dist/icons/RightIcon.js +1 -1
  481. package/dist/icons/RowTotalsIcon.js +1 -1
  482. package/dist/icons/SchemeIcon.js +1 -1
  483. package/dist/icons/SearchIcon.js +1 -1
  484. package/dist/icons/SemanticQueryIcon.js +1 -1
  485. package/dist/icons/SettingsIcon.js +1 -1
  486. package/dist/icons/ShieldFilledIcon.js +1 -1
  487. package/dist/icons/ShieldIcon.js +1 -1
  488. package/dist/icons/SlashIcon.js +1 -1
  489. package/dist/icons/SparklesIcon.js +1 -1
  490. package/dist/icons/SqlIcon.js +1 -1
  491. package/dist/icons/StatsIcon.js +1 -1
  492. package/dist/icons/StopIcon.js +1 -1
  493. package/dist/icons/StringIcon.js +1 -1
  494. package/dist/icons/SubtotalsIcon.js +1 -1
  495. package/dist/icons/SwitchIcon.js +1 -1
  496. package/dist/icons/TableIcon.js +1 -1
  497. package/dist/icons/ThumbsDownIcon.js +1 -1
  498. package/dist/icons/ThumbsUpIcon.js +1 -1
  499. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  500. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  501. package/dist/icons/ThunderboltIcon.js +1 -1
  502. package/dist/icons/TimeIcon.js +1 -1
  503. package/dist/icons/TrashIcon.js +1 -1
  504. package/dist/icons/UnlockIcon.js +1 -1
  505. package/dist/icons/UpIcon.js +1 -1
  506. package/dist/icons/UserGroupIcon.js +1 -1
  507. package/dist/icons/UserIcon.js +1 -1
  508. package/dist/icons/UserLockIcon.js +1 -1
  509. package/dist/icons/ViewIcon.js +1 -1
  510. package/dist/icons/WarningFilledIcon.js +1 -1
  511. package/dist/icons/WarningIcon.js +1 -1
  512. package/dist/icons/wrap-icon.js +1 -1
  513. package/dist/index.d.ts +4 -3
  514. package/dist/index.js +3 -2
  515. package/dist/index.js.map +1 -1
  516. package/dist/probe/canonicalize.js +1 -1
  517. package/dist/probe/css.js +1 -1
  518. package/dist/probe/index.js +1 -1
  519. package/dist/provider.js +1 -1
  520. package/dist/providers/TrackingProvider.js +1 -1
  521. package/dist/providers/navigationAdapter.default.js +1 -1
  522. package/dist/tokens/base.js +1 -1
  523. package/dist/tokens/color-seed.js +1 -1
  524. package/dist/tokens/color-theme.js +1 -1
  525. package/dist/tokens/colors.js +1 -1
  526. package/dist/tokens/index.js +1 -1
  527. package/dist/tokens/layout.js +1 -1
  528. package/dist/tokens/lazy-styles.js +1 -1
  529. package/dist/tokens/palette-config.js +1 -1
  530. package/dist/tokens/palette.js +1 -1
  531. package/dist/tokens/shadows.js +1 -1
  532. package/dist/tokens/sizes.js +1 -1
  533. package/dist/tokens/spacing.js +1 -1
  534. package/dist/tokens/typography.js +1 -1
  535. package/dist/utils/ResizeSensor.js +1 -1
  536. package/dist/utils/is-dev-env.js +1 -1
  537. package/dist/utils/modules.js +1 -1
  538. package/dist/utils/promise.js +1 -1
  539. package/dist/utils/raf.js +1 -1
  540. package/dist/utils/random.js +1 -1
  541. package/dist/utils/range.js +1 -1
  542. package/dist/utils/react/RenderCache.js +1 -1
  543. package/dist/utils/react/Slots.js +1 -1
  544. package/dist/utils/react/chain.js +1 -1
  545. package/dist/utils/react/disabledProps.js +1 -1
  546. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  547. package/dist/utils/react/index.js +1 -1
  548. package/dist/utils/react/interactions.js +1 -1
  549. package/dist/utils/react/isTextOnly.js +1 -1
  550. package/dist/utils/react/mapProps.js +1 -1
  551. package/dist/utils/react/mergeProps.js +1 -1
  552. package/dist/utils/react/nullableValue.js +1 -1
  553. package/dist/utils/react/resolveIcon.js +1 -1
  554. package/dist/utils/react/sharedStore.js +1 -1
  555. package/dist/utils/react/useBufferedValue.js +1 -1
  556. package/dist/utils/react/useCombinedRefs.js +1 -1
  557. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  558. package/dist/utils/react/useEventBus.js +1 -1
  559. package/dist/utils/react/useId.js +1 -1
  560. package/dist/utils/react/useIsDarwin.js +1 -1
  561. package/dist/utils/react/useKeySymbols.js +1 -1
  562. package/dist/utils/react/useLayoutEffect.js +1 -1
  563. package/dist/utils/react/useLocalStorage.js +1 -1
  564. package/dist/utils/react/useMergeStyles.js +1 -1
  565. package/dist/utils/react/usePopoverSync.js +1 -1
  566. package/dist/utils/react/useQaProps.js +1 -1
  567. package/dist/utils/react/useViewportSize.js +1 -1
  568. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  569. package/dist/utils/selection.js +1 -1
  570. package/dist/utils/styles.js +1 -1
  571. package/dist/utils/tree.js +1 -1
  572. package/dist/utils/warnings.js +1 -1
  573. package/dist/version.js +3 -3
  574. package/docs/Introduction.md +85 -97
  575. package/docs/Usage.md +26 -0
  576. package/docs/components/data/DataTable.md +110 -11
  577. package/docs/components/data/ItemTable.md +63 -1
  578. package/docs/components/layout/Board.md +37 -6
  579. package/docs/components/overlays/Tooltip.md +12 -0
  580. package/docs/tasty/configuration.md +10 -6
  581. package/docs/tasty/dsl.md +99 -2
  582. package/docs/tasty/styles.md +3 -1
  583. package/package.json +2 -2
@@ -30,9 +30,9 @@ API keys. That is the one with selection, bulk actions, row menus and row links.
30
30
  ## It knows nothing about Cube
31
31
 
32
32
  Measures, dimensions, pivots, drill-downs and calculated fields never reach this
33
- component as concepts. They arrive as ordinary columns, `render` output and
34
- `column.header.menu` content — which is what keeps Cloud's column-header menu,
35
- and everything it knows about the query, in Cloud.
33
+ component as query concepts. They arrive as leaf columns, presentational column
34
+ groups, `render` output and `column.header.menu` content — which is what keeps
35
+ Cloud's column-header menu, and everything it knows about the query, in Cloud.
36
36
 
37
37
  ## Component
38
38
 
@@ -41,9 +41,19 @@ and everything it knows about the query, in Cloud.
41
41
  #### Data
42
42
 
43
43
  - **`data`** `readonly T[]` — The rows.
44
- - **`columns`** `CubeDataTableColumn<T>[]` — Same shape as `ItemTable`'s, plus `dataType`.
44
+ - **`columns`** `CubeDataTableColumnDefinition<T>[]` — Leaf columns use the same
45
+ shape as `ItemTable`'s, plus `dataType`; group nodes contain nested `children`.
45
46
  - **`rowKey`** `string` (default: `'id'`) — Property to read the row identity from.
46
47
  - **`getRowKey`** `(row: T, index: number) => Key` — Wins over `rowKey`.
48
+ - **`getRowChildren`** `(row: T) => readonly T[] | undefined` — Enables nested
49
+ treegrid rows; `data` contains roots.
50
+ - **`treeColumnKey`** `string` — Indented disclosure column. Defaults to the
51
+ first visible data column.
52
+ - **`expandedKeys`** `Key[]` — Controlled expansion.
53
+ - **`defaultExpandedKeys`** `Key[]` — Initial expansion. Nothing is expanded by
54
+ default.
55
+ - **`onExpand`** `(keys, info) => void` — Reports the resulting keys and toggled
56
+ row metadata.
47
57
  - **`pinnedTopRows`** `readonly T[]` — Rows stuck to the top of the scroller. Ordinary rows as far as the columns are concerned.
48
58
  - **`pinnedBottomRows`** `readonly T[]` — The same, at the bottom. This is where totals go.
49
59
 
@@ -63,10 +73,13 @@ and everything it knows about the query, in Cloud.
63
73
  - **`size`** `SizeName` (default: `'small'`) — An analytical grid packs more rows than a list.
64
74
  - **`rowSize`** `'small' | 'medium' | 'large'` — Row height as a named step: 28px / 32px / 40px. Rows only; the header keeps answering to `size`. Unset, the height comes from `size`.
65
75
  - **`rowHeight`** `number` — An exact height, when none of the named steps is the answer. Wins over both `rowSize` and `size`.
66
- - **`headerHeight`** `number`
76
+ - **`headerHeight`** `number` — Exact height of each header row in px.
67
77
  - **`isStriped`** `boolean` (default: `true`) — Banding is what makes a wide row readable across.
68
78
  - **`isHeaderHidden`** `boolean`
69
79
  - **`isHeaderSticky`** `boolean` (default: `true`)
80
+ - **`isAutoHeight`** `boolean` (default: `false`) — Shrink-wraps the frame to
81
+ the rendered rows instead of filling its flex pane. It takes precedence over
82
+ root height/flex sizing and disables virtualization.
70
83
  - **`isRowMoveAnimated`** `boolean` (default: `true`) — Slide rows to their new positions when the order changes, instead of teleporting them. Respects `prefers-reduced-motion`.
71
84
  - **`showRowNumbers`** `boolean` (default: `false`) — A continuous count down the side, which stays continuous across pages.
72
85
 
@@ -127,7 +140,7 @@ see [Column Colors](#column-colors) for the last two.
127
140
 
128
141
  #### Virtualization
129
142
 
130
- - **`isVirtualized`** `boolean | 'auto'` (default: `'auto'`) — On when the grid is height-bounded and has more rows than the threshold.
143
+ - **`isVirtualized`** `boolean | 'auto'` (default: `'auto'`) — On when the grid is height-bounded and has more rows than the threshold. Ignored when `isAutoHeight` is enabled.
131
144
  - **`virtualizeThreshold`** `number`
132
145
  - **`overscan`** `number`
133
146
 
@@ -136,6 +149,9 @@ see [Column Colors](#column-colors) for the last two.
136
149
  - **`getRowProps`** `(ctx: CubeTableRowContext<T>) => Record<string, any>` — Per-row mods, styles and height.
137
150
  - **`storageKey`** `string` — Persists page size, column widths and column order.
138
151
  - **`ariaLabel`** `string`
152
+ - **`isChecked`** `boolean` — Base checked-state modifier.
153
+ - **`place`** `string` — Tasty placement shorthand on the root frame.
154
+ - **`scrollMargin`** `string | number` — Scroll margin on the root frame.
139
155
 
140
156
  #### `dataType`
141
157
 
@@ -159,9 +175,10 @@ Customizes the root frame. Every internal part of the grid is a **sub-element**
159
175
  reachable from this one prop — the same contract, and the same sub-element
160
176
  names, as ItemTable.
161
177
 
162
- `DataTable` adds one: `StateCell`, the full-span cell that carries the empty,
163
- no-results and error content. It is deliberately not a `Cell`, so it takes none
164
- of the row's banding or hover paint.
178
+ `DataTable` adds `StateCell`, the full-span cell that carries the empty,
179
+ no-results and error content, and `HeaderGroupCell`, a spanning cell in a
180
+ multi-row header. `StateCell` is deliberately not a `Cell`, so it takes none of
181
+ the row's banding or hover paint.
165
182
 
166
183
  #### Targeted slots
167
184
 
@@ -204,6 +221,72 @@ body into a scroller, pins the header, and lets virtualization engage at all.
204
221
  Cell-level, in addition to `ItemTable`'s: `cell-selected`, `last-column`,
205
222
  `pinned`.
206
223
 
224
+ ## Pivoted Results and Column Groups
225
+
226
+ Pass group nodes in `columns` to render real multi-row headers. Groups may nest
227
+ to any depth; their `children` eventually resolve to ordinary leaf columns, and
228
+ only those leaves participate in sorting, resizing, ranges and copying.
229
+
230
+ ```jsx
231
+ const columns = [
232
+ { key: 'region', title: 'Region', pin: 'start' },
233
+ {
234
+ key: 'organic',
235
+ title: 'Organic',
236
+ children: [
237
+ { key: 'organic_orders', title: 'Orders', dataType: 'number' },
238
+ { key: 'organic_revenue', title: 'Revenue', dataType: 'number' },
239
+ ],
240
+ },
241
+ {
242
+ key: 'paid',
243
+ title: 'Paid',
244
+ children: [
245
+ { key: 'paid_orders', title: 'Orders', dataType: 'number' },
246
+ { key: 'paid_revenue', title: 'Revenue', dataType: 'number' },
247
+ ],
248
+ },
249
+ ];
250
+
251
+ <DataTable data={pivotRows} columns={columns} isAutoHeight />;
252
+ ```
253
+
254
+ The data/query layer still owns the pivot calculation. DataTable only renders
255
+ the already-shaped rows and generated column hierarchy. Leaf resizing and
256
+ sorting remain available; drag column reordering is ignored while groups are
257
+ present because moving one leaf cannot preserve an arbitrary hierarchy.
258
+
259
+ ## Tree Rows
260
+
261
+ Tree mode uses the same nested-data contract as `ItemTable`:
262
+
263
+ ```jsx
264
+ <DataTable
265
+ data={regions}
266
+ columns={columns}
267
+ getRowChildren={(row) => row.children}
268
+ treeColumnKey="region"
269
+ defaultExpandedKeys={['americas']}
270
+ />
271
+ ```
272
+
273
+ Multi-sort is recursive: every sibling collection is sorted by the same
274
+ precedence. Client pagination slices roots and keeps complete subtrees together;
275
+ server pages are rendered exactly as supplied and `total` counts roots. Pinned
276
+ rows remain ordinary non-hierarchical totals.
277
+
278
+ Only visible descendants participate in cell ranges and virtualization.
279
+ Collapsing a range endpoint makes the effective range inactive; a controlled or
280
+ uncontrolled range is restored when that endpoint becomes visible again. Client
281
+ row numbers remain continuous across root pages, while server tree pages restart
282
+ at 1 because preceding descendant counts are unknown.
283
+
284
+ The native table exposes `role="treegrid"`, `aria-level`, `aria-expanded`,
285
+ `aria-posinset` and `aria-setsize`. Right/Left expand, collapse or move to the
286
+ parent; Up/Down traverse visible rows, and typeahead reads `treeColumnKey`.
287
+ Customize the hierarchy chrome with `styles.TreeContent`, `styles.TreeToggle`
288
+ and `styles.TreeValue`.
289
+
207
290
  ## Examples
208
291
 
209
292
  ### Multi-Column Sorting
@@ -241,6 +324,20 @@ competing for a position.
241
324
  Above `virtualizeThreshold` a bounded grid virtualizes on its own, so
242
325
  `paginationMode="off"` is a reasonable default for a result the user scrolls.
243
326
 
327
+ For a compact result that should participate in normal page flow, set
328
+ `isAutoHeight`. The frame then ends at the last rendered row rather than filling
329
+ its flex pane. This renders the complete result and disables virtualization, so
330
+ keep larger results bounded instead.
331
+
332
+ ```jsx
333
+ <DataTable
334
+ data={summaryRows}
335
+ columns={columns}
336
+ paginationMode="off"
337
+ isAutoHeight
338
+ />
339
+ ```
340
+
244
341
  ### Sorting Moves Rows
245
342
 
246
343
  When a sort reorders rows, they slide to their new positions over 120ms rather
@@ -401,8 +498,10 @@ elsewhere.
401
498
  ## Accessibility
402
499
 
403
500
  The table is a `role="grid"` with document-absolute `aria-rowindex` /
404
- `aria-colindex`, and `aria-rowcount` counts pinned rows. Every sorted column
405
- carries `aria-sort`, not just the first.
501
+ `aria-colindex`, and `aria-rowcount` counts pinned rows and every visible header
502
+ row. Group cells use native `scope="colgroup"` / `colSpan`; ungrouped leaf
503
+ headers span the remaining rows. Every sorted leaf column carries `aria-sort`,
504
+ not just the first.
406
505
 
407
506
  A header cell takes a tab stop when it is interactive — sortable, carrying a
408
507
  menu, or reorderable. `Shift`+`F10` opens the column menu from the keyboard, and
@@ -31,6 +31,14 @@ pivots, totals. Use `ListBox` when there is only one column.
31
31
  - **`columns`** `CubeItemTableColumn<T>[]` — Column definitions. See below.
32
32
  - **`rowKey`** `string` (default: `'id'`) — Property used as the row key.
33
33
  - **`getRowKey`** `(row: T, index: number) => Key` — Wins over `rowKey`.
34
+ - **`getRowChildren`** `(row: T) => readonly T[] | undefined` — Enables tree
35
+ mode. `data` then contains top-level rows and children are read recursively.
36
+ - **`treeColumnKey`** `string` — Column containing indentation and the
37
+ disclosure control. Defaults to the first visible data column.
38
+ - **`expandedKeys`** `Key[]` — Controlled expanded rows.
39
+ - **`defaultExpandedKeys`** `Key[]` — Initially expanded rows. Defaults to none.
40
+ - **`onExpand`** `(keys, info) => void` — Reports the complete expanded-key list
41
+ and the toggled row, key, zero-based level, parent key and resulting state.
34
42
  - **`isLoading`** `boolean` (default: `false`) — Marks a fetch in flight. What
35
43
  the user sees depends on `loadingIndicator`.
36
44
  - **`loadingIndicator`** `'overlay' | 'skeleton' | 'none'` (default: `'overlay'`)
@@ -65,6 +73,9 @@ pivots, totals. Use `ListBox` when there is only one column.
65
73
  row and drops it from `aria-rowcount`.
66
74
  - **`isHeaderSticky`** `boolean` (default: `true`) — Pins the column header
67
75
  while the body scrolls.
76
+ - **`isAutoHeight`** `boolean` (default: `false`) — Shrink-wraps the frame to
77
+ the rendered rows instead of filling its flex pane. It takes precedence over
78
+ root height/flex sizing and disables virtualization.
68
79
  - **`sortMode`** `'client' | 'server' | 'off'` (default: `'client'` when any
69
80
  column is sortable, else `'off'`) — `client` reorders `data` itself; `server`
70
81
  only reflects `sort` and fires `onSortChange`; `off` removes the affordance.
@@ -96,7 +107,8 @@ pivots, totals. Use `ListBox` when there is only one column.
96
107
  toolbar.
97
108
  - **`isVirtualized`** `boolean | 'auto'` (default: `'auto'`) — `'auto'` turns
98
109
  virtualization on once the row count passes `virtualizeThreshold`. It needs a
99
- bounded height to have a viewport to work against.
110
+ bounded height to have a viewport to work against and is ignored when
111
+ `isAutoHeight` is enabled.
100
112
  - **`virtualizeThreshold`** `number` (default: `50`) — Row count above which
101
113
  `'auto'` virtualizes.
102
114
  - **`overscan`** `number` (default: `12`) — Rows mounted beyond each viewport
@@ -117,6 +129,10 @@ pivots, totals. Use `ListBox` when there is only one column.
117
129
  - **`selectionTooltip`** `string | ((row: T) => string | undefined)` — Explains
118
130
  an inert checkbox.
119
131
  - **`disabledKeys`** `Key[]` — Rows that cannot be interacted with at all.
132
+ - **`treeSelectionBehavior`** `'cascade' | 'independent'` (default: `'cascade'`
133
+ in tree mode) — Multiple selection only. Cascade selects eligible descendants
134
+ and derives checked or indeterminate ancestors; single selection is always
135
+ independent.
120
136
  - **`rowLink`** `(row: T, index: number) => NavigateArg | undefined` — Turns the
121
137
  row-header cell into a stretched link covering the whole row. Return
122
138
  `undefined` for a row that should not navigate.
@@ -207,6 +223,9 @@ pivots, totals. Use `ListBox` when there is only one column.
207
223
  - **`getRowProps`** `(ctx) => { isDimmed?, mods?, styles?, height?, qa?, tooltip? }`
208
224
  — Per-row visuals.
209
225
  - **`ariaLabel`** `string` — Labels the grid.
226
+ - **`isChecked`** `boolean` — Base checked-state modifier.
227
+ - **`place`** `string` — Tasty placement shorthand on the root frame.
228
+ - **`scrollMargin`** `string | number` — Scroll margin on the root frame.
210
229
 
211
230
  #### `CubeItemTableColumn<T>`
212
231
 
@@ -291,6 +310,8 @@ reachable from this one prop — that is the whole styling contract.
291
310
  - `Table` — the `<table>`
292
311
  - `Head`, `HeadRow`, `HeaderCell` — the column header
293
312
  - `Body`, `Row`, `Cell` — the data rows
313
+ - `TreeContent`, `TreeToggle`, `TreeValue` — indentation, disclosure/leaf
314
+ placeholder, and the consumer-rendered value in the tree column
294
315
  - `SortIndicator` — the sort arrow, inside the header `Item`'s suffix
295
316
  - `Foot`, `FootRow`, `FootCell` — pinned totals
296
317
  - `StateContent` — the empty / no-results / error content
@@ -390,6 +411,39 @@ Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
390
411
  />
391
412
  ```
392
413
 
414
+ ### Tree Rows
415
+
416
+ Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep their
417
+ original objects; keys must be unique across the complete hierarchy.
418
+
419
+ ```jsx
420
+ <ItemTable
421
+ data={folders}
422
+ columns={columns}
423
+ getRowChildren={(row) => row.children}
424
+ treeColumnKey="name"
425
+ defaultExpandedKeys={['production']}
426
+ selectionMode="multiple"
427
+ />
428
+ ```
429
+
430
+ Client sorting runs independently within every sibling collection. Client
431
+ search retains ancestor paths; a matching parent keeps its complete subtree,
432
+ and required branches open temporarily without changing `expandedKeys`. Client
433
+ pagination counts and slices roots, keeping each subtree on its parent's page.
434
+ Server modes treat the supplied nested page as already processed, and `total`
435
+ counts roots.
436
+
437
+ The chevron and Right/Left arrows expand or collapse. Up/Down traverse visible
438
+ rows, typeahead uses the tree column, and Left on a collapsed child moves to its
439
+ parent. Ordinary row clicks still activate `onRowAction`/`rowLink`; the
440
+ disclosure does not. Select-all includes collapsed descendants. Disabled and
441
+ unselectable descendants are excluded from cascade.
442
+
443
+ Tree mode ignores `isReorderable`, because a flat reordered array cannot encode
444
+ parents. `dropOnRow` remains available for folder moves; self/descendant cycles
445
+ are rejected and selected descendants are collapsed under a dragged ancestor.
446
+
393
447
  ### Custom Cells
394
448
 
395
449
  ```jsx
@@ -668,6 +722,14 @@ DOM and the styles are identical either way — only the number of mounted rows
668
722
  changes, so sorting, search, pinned columns and the sticky header all behave the
669
723
  same.
670
724
 
725
+ For a compact list in normal page flow, set `isAutoHeight`. Its frame then ends
726
+ at the final rendered row instead of filling the surrounding flex pane. The
727
+ complete result is rendered, so keep large lists bounded and virtualized.
728
+
729
+ ```jsx
730
+ <ItemTable data={recentRows} columns={columns} paginationMode="off" isAutoHeight />
731
+ ```
732
+
671
733
  ```jsx
672
734
  <ItemTable height="420px" paginationMode="off" data={tenThousandRows} columns={columns} />
673
735
  ```
@@ -53,7 +53,8 @@ clipped by an ancestor's `overflow: hidden`.
53
53
  - **`onDragStart` / `onDrag` / `onDragStop`** `(info: BoardInteractionInfo) => void` — Drag lifecycle callbacks. `onDrag` fires on every step; `onDragStop` fires after the layout is committed.
54
54
  - **`onResizeStart` / `onResize` / `onResizeStop`** `(info: BoardInteractionInfo) => void` — Resize lifecycle callbacks, mirroring the drag ones.
55
55
  - **`cols`** `number` (default: `12`) — Number of columns.
56
- - **`rowHeight`** `number` (default: `100`) Row height in pixels.
56
+ - **`rows`** `number` Render exactly this many rows, whatever the content needs — a fixed `cols × rows` matrix rather than a grid that hugs its widgets. Implies a `maxRows` of the same value, so `gridBounds` keeps every drag and resize inside the matrix without a per-widget `maxH`.
57
+ - **`rowHeight`** `number | 'stretch'` (default: `100`) — Row height in pixels, or `'stretch'` to divide the board's own measured height into its rows. `'stretch'` is what makes a fixed `rows × cols` matrix fill the box it is given: the board takes its parent's height and each cell an equal share of it, so resizing the container resizes the cells instead of adding or removing them. Requires `rows`: without a declared row count there is no matrix to fill, and dividing by the content extent instead would resize every cell whenever a widget landed on a new row. Unset, or before the parent's height is known, the board keeps its ordinary content-hugging behaviour at the default row height rather than collapsing.
57
58
  - **`margin`** `[number, number]` (default: `[8, 8]`) — Horizontal/vertical gap between widgets.
58
59
  - **`containerPadding`** `[number, number]` — Inner padding. Defaults to `margin`, or to `[0, 0]` for an aligned nested board (`isAligned`) so its grid lines up with the ancestor board's.
59
60
  - **`maxRows`** `number` (default: `Infinity`) — Maximum number of rows.
@@ -61,7 +62,7 @@ clipped by an ancestor's `overflow: hidden`.
61
62
  - **`compact`** `'vertical' | 'horizontal' | 'free' | null` (default: `'vertical'`) — Compaction behavior. `'vertical'`/`'horizontal'` reflow widgets to remove gaps; `'free'` places each widget exactly where dropped and never pushes its neighbours (blocked from occupied cells unless `allowOverlap`); `null` disables compaction but still resolves collisions the legacy react-grid-layout way.
62
63
  - **`allowOverlap`** `boolean` (default: `false`) — Allow widgets to overlap (stack). In `'free'` mode this is what distinguishes stacking from blocking a drop onto an occupied cell.
63
64
  - **`preventCollision`** `boolean` (default: `false`) — Block movement into occupied cells instead of pushing.
64
- - **`collisionMode`** `'revert' | 'downscale' | 'swap'` (default: `'revert'`) — How to resolve a drop the grid would otherwise refuse. Only applies where a collision *blocks* a move — `compact="free"` (which prevents collisions) or an explicit `preventCollision` — and never under `allowOverlap`, where nothing is blocked. `'revert'` snaps the widget back. `'downscale'` shrinks it into the free space at the drop cell, growing rightward and downward, floored at its `minW`/`minH` (below that it reverts). `'swap'` trades places with **one** widget — the one the drop covers most — which takes the cell the drag began at, each keeping as much of its own size as fits there (so a widget displaced next to a neighbour may shrink). It never displaces more than that one widget. A drop straddling two widgets trades with one of them rather than refusing, so the swap never blinks away as you sweep across a boundary; ties go to the widget earlier in reading order. Dragging back retraces the original arrangement exactly. It falls back to `'downscale'`, then `'revert'`. No mode ever *grows* a widget: a drag only ever preserves or reduces size. Applies to single-widget drags. Arrow keys honour it too but never resize anything — each press is a gesture of its own, so a press that shrank a widget would have nothing to restore from, and only an exchange that fits outright is allowed. A multi-widget selection still only moves where it fits outright, and a resize is still blocked by a collision.
65
+ - **`collisionMode`** `'revert' | 'downscale' | 'swap'` (default: `'revert'`) — How to resolve a drop the grid would otherwise refuse. Only applies where a collision *blocks* a move — `compact="free"` (which prevents collisions) or an explicit `preventCollision` — and never under `allowOverlap`, where nothing is blocked. `'revert'` snaps the widget back. `'downscale'` shrinks it into the free space at the drop cell, growing rightward and downward, floored at its `minW`/`minH` (below that it reverts). Within one board, `'swap'` trades places with **one** widget — the one the drop covers most — which takes the cell the drag began at, each keeping as much of its own size as fits there. It never displaces more than that one widget. A drop straddling two widgets trades with one of them rather than refusing, so the swap never blinks away as you sweep across a boundary; ties go to the widget earlier in reading order. Dragging back retraces the original arrangement exactly. For a widget arriving from another board (including a nested board entering its parent), the destination board's `'swap'` mode becomes strict insertion: the requested anchor cell must be empty, the incoming widget keeps its size when possible or downscales into the available room to its right and below, and existing destination widgets are neither exchanged nor reflowed. Releasing over an occupied anchor or where `minW`/`minH` cannot fit cancels the transfer and restores both boards; it does not reuse the last valid preview or search for another slot. No mode ever *grows* a widget. Applies to single-widget drags. Arrow keys honour it too but never resize anything — each press is a gesture of its own, so a press that shrank a widget would have nothing to restore from, and only an exchange that fits outright is allowed. A multi-widget selection still only moves where it fits outright, and a resize is still blocked by a collision.
65
66
  - **`isDraggable`** `boolean` (default: `true`) — Enable dragging for all widgets.
66
67
  - **`isResizable`** `boolean` (default: `true`) — Enable resizing for all widgets.
67
68
  - **`isDroppable`** `boolean` (default: `true`) — Whether the board accepts widgets dropped from other boards.
@@ -87,6 +88,7 @@ clipped by an ancestor's `overflow: hidden`.
87
88
  ### Board.Widget
88
89
 
89
90
  - **`id`** `string` (required) — Must match the `i` of a layout item.
91
+ - **`hoverRing`** `boolean` (default: `true`) — Whether the widget shows the resting ring on hover — the affordance that says it can be picked up. Turn it off for a widget that is scenery rather than a thing to grab (a chromeless layout container, a spacer), where the ring advertises an interaction the widget does not really offer. Selection and drag treatments are unaffected. Can be set for the whole board via `widgetProps`.
90
92
  - **`isCard`** `boolean` (default: `false`) — Render this widget as a card by adding a border. Widgets are always filled (`#surface-2`) and rounded (`1cr`); `isCard` adds the border on top. Defaults to `false` (borderless) unless the owning `Board`'s `widgetProps.isCard` opts in; set it per widget to override that default.
91
93
  - **`isDraggable`** `boolean` — Disable dragging for this widget.
92
94
  - **`isResizable`** `boolean` — Disable resizing for this widget.
@@ -159,6 +161,7 @@ through `widgetProps.styles` or a per-widget `styles` resolves against them.
159
161
  - **`pre-selected`** — a live marquee covers the widget, so releasing the pointer
160
162
  will select it. Never set at the same time as `selected`.
161
163
  - **`card`** — the widget draws a card border (`isCard`).
164
+ - **`no-hover-ring`** — the widget opted out of the resting hover ring (`hoverRing={false}`).
162
165
  - **`draggable`** — the widget can be dragged and no drag is in flight.
163
166
  - **`drag`** — the widget is being dragged.
164
167
  - **`floating`** — this is the clone floating in the drag overlay.
@@ -219,6 +222,13 @@ CSS margin.
219
222
 
220
223
  ### Controlled layout
221
224
 
225
+ ### Fixed matrix
226
+
227
+ `rows` with `rowHeight="stretch"` gives a board of a declared size that fills its
228
+ container: a `cols × rows` matrix whose cells resize with the box rather than a
229
+ grid that grows a row at a time. Pair it with `compact="free"` for a canvas the
230
+ author places things on directly.
231
+
222
232
  ### Free positioning
223
233
 
224
234
  A widget stays exactly where you drop it and never shuffles its neighbours.
@@ -252,10 +262,11 @@ so it lines up with a control centred on the opposite corner.
252
262
  ### Resolving a blocked drop
253
263
 
254
264
  On a free grid a drop onto occupied cells is refused. `collisionMode` resolves it
255
- instead: `'downscale'` shrinks the widget into whatever room is at the drop cell,
256
- `'swap'` trades places with the widget already there. Neither ever grows a widget.
257
- One board per mode below drag the wide widget onto the row below in the first,
258
- and drop a widget onto one of its neighbours in the second.
265
+ instead: `'downscale'` shrinks the widget into whatever room is at the drop cell.
266
+ Within one board, `'swap'` trades places with the widget already there. Across
267
+ boards, the same mode inserts only at an empty anchor and downscales without
268
+ moving destination widgets; an invalid release cancels the transfer. None of
269
+ these paths ever grows a widget. The examples below show all three behaviors.
259
270
 
260
271
  ### Card widgets
261
272
 
@@ -419,6 +430,26 @@ described above. Set `aria-label` on your widgets and this reads correctly.
419
430
  ring, so it does not rely on hue alone, but a full forced-colors pass is a
420
431
  system-wide change.
421
432
 
433
+ ## Layout helpers
434
+
435
+ Placement questions the board answers for itself during a gesture, exported so an
436
+ app can ask them for a widget it adds programmatically. Without these, an app
437
+ re-implements the scan, and the same drop lands in two different cells depending
438
+ on whether a pointer or a code path served it.
439
+
440
+ - **`placeInFreeSlot(others, item, cols, maxRows?)`** — the first position at or
441
+ below the item's preferred cell where it fits without overlapping `others`,
442
+ scanning the preferred row first, then down, then up. Never past `maxRows`, and
443
+ never resizes to fit (only `w` is capped to `cols`). This is the rule the board
444
+ itself applies when a dragged widget cannot stay where it was dropped.
445
+ - **`distributeEvenly(layout, { cols, rows })`** — tile every item evenly across
446
+ both axes, keeping the row structure the layout already has: items are grouped
447
+ into visual rows by their current `y`, `rows` is divided across the groups and
448
+ `cols` across each group's members. A line holding more items than the grid is
449
+ wide wraps into sub-rows. This is the one operation that deliberately *grows*
450
+ items — every gesture-driven path refuses to, which is why it is a call the app
451
+ makes rather than a mode the board is in.
452
+
422
453
  ## Attribution
423
454
 
424
455
  The layout engine in `grid-core/` is a vendored, trimmed copy of
@@ -138,6 +138,18 @@ Control where the tooltip appears relative to its trigger:
138
138
  </TooltipProvider>
139
139
  ```
140
140
 
141
+ ### Long Content
142
+
143
+ The tooltip is capped at `36x` wide (or the viewport minus `4x`, whichever is smaller) and wraps
144
+ its content to stay inside that cap. Runs with no spaces — URLs, tokens, identifiers, error strings —
145
+ are broken mid-word rather than allowed to overflow the bubble.
146
+
147
+ ```jsx
148
+ <TooltipProvider title="https://cubecloud.example.com/deployments/12345/schema/files/model/cubes/very_long_cube_name.yml">
149
+ <Button>Hover me</Button>
150
+ </TooltipProvider>
151
+ ```
152
+
141
153
  ### Light Theme
142
154
 
143
155
  Use the light theme for tooltips on dark backgrounds:
@@ -78,7 +78,7 @@ These docs use `data-schema="dark"` in examples. If your app already standardize
78
78
 
79
79
  ## Color Space
80
80
 
81
- Controls the CSS color space used for decomposed color token companion variables. When you define `#name` color tokens, tasty generates both `--name-color` (full color) and `--name-color-{suffix}` (decomposed components for alpha composition).
81
+ Controls the CSS color space used for decomposed color token companion variables. When you define `#name` color tokens, tasty generates both `--name-color` (the color) and `--name-color-{suffix}` (its channels, decomposed).
82
82
 
83
83
  ```jsx
84
84
  configure({
@@ -86,13 +86,17 @@ configure({
86
86
  });
87
87
  ```
88
88
 
89
- | Color Space | Suffix | Components Format | Alpha Syntax |
89
+ | Color Space | Suffix | Components Format | Channel Reference |
90
90
  |---|---|---|---|
91
- | `rgb` | `-rgb` | `255 128 0` | `rgb(var(--name-color-rgb) / .5)` |
92
- | `hsl` | `-hsl` | `300 100% 25%` | `hsl(var(--name-color-hsl) / .5)` |
93
- | `oklch` | `-oklch` | `0.42 0.16 328` | `oklch(var(--name-color-oklch) / .5)` |
91
+ | `rgb` | `-rgb` | `255 128 0` | `rgb(var(--name-color-rgb))` |
92
+ | `hsl` | `-hsl` | `300 100% 25%` | `hsl(var(--name-color-hsl))` |
93
+ | `oklch` | `-oklch` | `0.42 0.16 328` | `oklch(var(--name-color-oklch))` |
94
94
 
95
- The `oklch` color space is the default because it provides perceptually uniform color manipulation — alpha fading and color mixing produce more natural-looking results.
95
+ The `oklch` color space is the default because it provides perceptually uniform color manipulation — reaching for a channel to shift lightness or hue produces more natural-looking results.
96
+
97
+ The companion is there so you can *address the channels*: shift a lightness, animate a hue, build a derived color. It is not how the [opacity suffix](dsl.md#color-tokens--opacity) works — that sets the alpha on `--name-color` itself with relative color syntax, so it needs nothing from the companion and works on any color.
98
+
99
+ A color the engine cannot evaluate at build time — a `color-mix()`, a `light-dark()`, a `color()` in a space it has no conversion for — has no channels to decompose, so its companion is expressed *by reference* using CSS relative color syntax (`--name-color-oklch: from color-mix(…) l c h`). Reading a channel off it still works; the browser resolves them.
96
100
 
97
101
  ---
98
102
 
package/docs/tasty/dsl.md CHANGED
@@ -111,7 +111,7 @@ const List = tasty({
111
111
  Named color prefixed with `#` that maps to CSS custom properties. Supports opacity with `.N` suffix:
112
112
 
113
113
  ```jsx
114
- fill: '#purple.5' // → var(--purple-color) with 50% opacity
114
+ fill: '#purple.5' // → oklch(from var(--purple-color) l c h / .5)
115
115
  ```
116
116
 
117
117
  ### Modifier
@@ -133,11 +133,108 @@ Modifiers can also be exposed as top-level component props via `modProps` — se
133
133
  color: '#purple', // Full opacity
134
134
  color: '#purple.5', // 50% opacity
135
135
  color: '#purple.05', // 5% opacity
136
+ color: '#purple.$fade', // Opacity from a custom property
136
137
  fill: '#current', // → currentcolor
137
- fill: '#current.5', // → color-mix(in oklab, currentcolor 50%, transparent)
138
138
  color: '(#primary, #secondary)', // Fallback syntax
139
139
  ```
140
140
 
141
+ The suffix sets the alpha on the token's color with CSS relative color syntax:
142
+
143
+ ```jsx
144
+ fill: '#purple.5';
145
+ // → oklch(from var(--purple-color) l c h / .5)
146
+ ```
147
+
148
+ The channels are copied over and the alpha slot is written, which asks nothing of
149
+ the color beyond *being* a color. That means the suffix works on every one of
150
+ these:
151
+
152
+ - a token holding a `color-mix()`, a `light-dark()`, or a `color()` in a space
153
+ Tasty cannot convert — none of which have channels to decompose
154
+ - `#current`, which resolves to `currentcolor`
155
+ - a `--name-color` variable declared in your own CSS, with no Tasty token
156
+ definition and no companion variable behind it
157
+
158
+ Two properties follow from writing the alpha slot rather than compositing:
159
+
160
+ - **Alpha is replaced, not multiplied.** A token holding `rgb(255 0 0 / .8)`
161
+ faded to `.5` is alpha `.5`, not `.4`.
162
+ - **The alpha may be a number or a percentage.** `#purple.$fade` emits
163
+ `/ var(--fade)` unchanged, so it works whether `$fade` holds `.5` or `50%` —
164
+ which is what `--*-opacity` properties are registered to accept.
165
+
166
+ ### `#current` composes instead
167
+
168
+ `#current` is the one exception, and the difference is deliberate. A token *names*
169
+ a color, so fading it sets its alpha. `currentcolor` is the color an element
170
+ **inherits**, which an ancestor may already have faded — `#current.4` means "40%
171
+ of what reaches me":
172
+
173
+ ```jsx
174
+ fill: '#current.4';
175
+ // → color-mix(in oklab, currentcolor 40%, transparent)
176
+ ```
177
+
178
+ So a `#current` fade nested inside another one composes: a label at `#current.4`
179
+ with a fill of `#current.18` under it lands at `.072`. Color ramps built on
180
+ `#current` depend on that — replacing would double the opacity of every nested
181
+ step. Because a `color-mix()` percentage cannot be a `<number>`, an opacity
182
+ custom property used as `#current.$fade` must hold a unitless number; a token
183
+ accepts either form.
184
+
185
+ The space is always `oklch`, whatever [`colorSpace`](configuration.md#color-space)
186
+ is set to: it is unbounded, so a wide-gamut color survives a round trip that a
187
+ gamut-limited space would clamp.
188
+
189
+ ---
190
+
191
+ ## CSS Color Functions
192
+
193
+ Every CSS color function is recognized as a color, so it lands in the color slot
194
+ of whichever style property you use it in — and tokens inside it are expanded:
195
+
196
+ ```jsx
197
+ fill: 'color-mix(in oklab, #primary 50%, #surface)',
198
+ color: 'light-dark(#dark, #light)',
199
+ color: 'contrast-color(#primary)',
200
+ fill: 'color(display-p3 1 .5 0)',
201
+ border: '1bw solid oklch(from #primary l c h / 50%)', // relative color syntax
202
+ shadow: '0 0 1x color-mix(in oklab, #dark 20%, transparent)',
203
+ ```
204
+
205
+ `light-dark()` is the one exception to "always a color": CSS lets it pick between
206
+ values of any type, so it is treated as a color only when its arguments are
207
+ colors. `padding: 'light-dark(1x, 2x)'` still reaches the padding slot.
208
+
209
+ A color token defined as one of these functions takes the
210
+ [opacity suffix](#color-tokens--opacity) like any other:
211
+
212
+ ```jsx
213
+ const Card = tasty({
214
+ styles: {
215
+ '#brand': 'color-mix(in oklab, #primary 50%, #surface)',
216
+ fill: '#brand.5',
217
+ },
218
+ });
219
+ ```
220
+
221
+ A [replace token](configuration.md#replace-tokens-parse-time-substitution) is
222
+ substituted while parsing, so its color is right there to fade in place. A
223
+ channel function takes the alpha after a slash; a derived function has no alpha
224
+ channel, so it gets wrapped:
225
+
226
+ ```jsx
227
+ configure({
228
+ replaceTokens: {
229
+ '#solid': 'hsl(220 90% 50%)',
230
+ '#adaptive': 'light-dark(#dark, #light)',
231
+ },
232
+ });
233
+
234
+ fill: '#solid.5'; // → hsl(220 90% 50% / .5)
235
+ fill: '#adaptive.5'; // → oklch(from light-dark(…) l c h / .5)
236
+ ```
237
+
141
238
  ---
142
239
 
143
240
  ## Built-in Units
@@ -254,6 +254,7 @@ Background color with design token support. Preferred over `backgroundColor` and
254
254
  | `"#purple.10"` | Token color at 10% opacity |
255
255
  | `"#surface #primary.10"` | Background `#surface` with `#primary.10` overlay (two colors enable smooth transitions between both) |
256
256
  | `"rgb(255 128 0)"` | CSS color value |
257
+ | `"color-mix(in oklab, #primary 50%, #surface)"` | CSS color function — see [CSS Color Functions](dsl.md#css-color-functions) |
257
258
  | `true` | Default fill color |
258
259
 
259
260
  When two colors are provided, the first sets the background color and the second is applied as an overlay gradient layer. This enables independent CSS transitions on each color. The overlay is only applied when no explicit `image` or `backgroundImage` is set.
@@ -286,9 +287,10 @@ Text color with design token support.
286
287
  | `"#current"` | Current inherited color |
287
288
  | `"#current.5"` | Current inherited color at 50% opacity |
288
289
  | `"(#primary, #secondary)"` | Fallback: use `#primary`, fall back to `#secondary` |
290
+ | `"light-dark(#dark, #light)"` | CSS color function — see [CSS Color Functions](dsl.md#css-color-functions) |
289
291
  | `true` | `currentColor` |
290
292
 
291
- When set to a named color token, also sets `$current-color` and `$current-color-{colorSpace}` custom properties for downstream use (suffix depends on the configured `colorSpace`, default `oklch`).
293
+ When set to a named color token, also sets `$current-color` and `$current-color-{colorSpace}` custom properties for downstream use (suffix depends on the configured `colorSpace`, default `oklch`). An opacity suffix does not move the companion: `color="#purple.5"` still reports `#purple`'s channels, since components carry no alpha.
292
294
 
293
295
  ### `svgFill`
294
296
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cube-dev/ui-kit",
3
- "version": "0.164.0",
3
+ "version": "0.166.0",
4
4
  "type": "module",
5
5
  "description": "UIKit for Cube Projects",
6
6
  "repository": {
@@ -59,7 +59,7 @@
59
59
  "@tabler/icons-react": "^3.31.0",
60
60
  "@tanstack/react-virtual": "^3.13.12",
61
61
  "@tenphi/glaze": "2.0.0",
62
- "@tenphi/tasty": "^3.0.2",
62
+ "@tenphi/tasty": "^3.1.0",
63
63
  "clipboard-copy": "^4.0.1",
64
64
  "clsx": "^1.1.1",
65
65
  "diff": "^8.0.3",