@cube-dev/ui-kit 0.162.0 → 0.164.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 (654) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +420 -0
  3. package/dist/README.md +1 -1
  4. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  5. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  6. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  7. package/dist/_internal/hooks/use-event.js +1 -1
  8. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  9. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  10. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  11. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/dist/_internal/hooks/use-warn.js +1 -1
  13. package/dist/components/Block.js +1 -1
  14. package/dist/components/CollectionItem.js +1 -1
  15. package/dist/components/GlobalStyles.js +1 -1
  16. package/dist/components/GridProvider.js +1 -1
  17. package/dist/components/HiddenInput.js +1 -1
  18. package/dist/components/Root.d.ts +3 -2
  19. package/dist/components/Root.js +1 -1
  20. package/dist/components/Root.js.map +1 -1
  21. package/dist/components/actions/Action/Action.js +1 -1
  22. package/dist/components/actions/Banner/Banner.js +2 -5
  23. package/dist/components/actions/Banner/Banner.js.map +1 -1
  24. package/dist/components/actions/Button/Button.d.ts +3 -2
  25. package/dist/components/actions/Button/Button.js +8 -5
  26. package/dist/components/actions/Button/Button.js.map +1 -1
  27. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  28. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  29. package/dist/components/actions/ButtonSplit/context.js +1 -1
  30. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  31. package/dist/components/actions/CommandMenu/styled.js +1 -1
  32. package/dist/components/actions/ItemAction/ItemAction.d.ts +2 -2
  33. package/dist/components/actions/ItemAction/ItemAction.js +15 -6
  34. package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
  35. package/dist/components/actions/ItemActionContext.d.ts +14 -0
  36. package/dist/components/actions/ItemActionContext.js +2 -2
  37. package/dist/components/actions/ItemActionContext.js.map +1 -1
  38. package/dist/components/actions/ItemButton/ItemButton.js +56 -46
  39. package/dist/components/actions/ItemButton/ItemButton.js.map +1 -1
  40. package/dist/components/actions/Link/Link.js +1 -1
  41. package/dist/components/actions/Menu/Menu.js +1 -1
  42. package/dist/components/actions/Menu/MenuItem.js +1 -1
  43. package/dist/components/actions/Menu/MenuSection.js +1 -1
  44. package/dist/components/actions/Menu/MenuTrigger.d.ts +13 -0
  45. package/dist/components/actions/Menu/MenuTrigger.js +27 -15
  46. package/dist/components/actions/Menu/MenuTrigger.js.map +1 -1
  47. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  48. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  49. package/dist/components/actions/Menu/context.js +1 -1
  50. package/dist/components/actions/Menu/styled.js +1 -1
  51. package/dist/components/actions/index.js +1 -1
  52. package/dist/components/actions/use-action.js +1 -1
  53. package/dist/components/actions/use-anchored-menu.js +1 -2
  54. package/dist/components/actions/use-anchored-menu.js.map +1 -1
  55. package/dist/components/actions/use-context-menu.js +1 -2
  56. package/dist/components/actions/use-context-menu.js.map +1 -1
  57. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  58. package/dist/components/content/Alert/Alert.js +1 -1
  59. package/dist/components/content/Alert/use-alert.js +1 -1
  60. package/dist/components/content/Avatar/Avatar.js +1 -1
  61. package/dist/components/content/Badge/Badge.js +1 -1
  62. package/dist/components/content/Card/Card.js +1 -1
  63. package/dist/components/content/Content.js +1 -1
  64. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  65. package/dist/components/content/CopySnippet/CopySnippet.d.ts +10 -0
  66. package/dist/components/content/CopySnippet/CopySnippet.js +7 -4
  67. package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
  68. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  69. package/dist/components/content/Divider.js +1 -1
  70. package/dist/components/content/Footer.js +1 -1
  71. package/dist/components/content/Header.js +1 -1
  72. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  73. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  74. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  75. package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
  76. package/dist/components/content/Item/Item.d.ts +2 -2
  77. package/dist/components/content/Item/Item.js +13 -58
  78. package/dist/components/content/Item/Item.js.map +1 -1
  79. package/dist/components/content/ItemBadge/ItemBadge.d.ts +1 -1
  80. package/dist/components/content/ItemBadge/ItemBadge.js +7 -4
  81. package/dist/components/content/ItemBadge/ItemBadge.js.map +1 -1
  82. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  83. package/dist/components/content/Layout/GridLayout.js +1 -1
  84. package/dist/components/content/Layout/Layout.js +1 -1
  85. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  86. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  87. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  88. package/dist/components/content/Layout/LayoutContent.js +1 -1
  89. package/dist/components/content/Layout/LayoutContext.js +1 -1
  90. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  91. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  92. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  93. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  94. package/dist/components/content/Layout/LayoutPane.js +1 -1
  95. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  96. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  97. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  98. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  99. package/dist/components/content/Layout/index.js +1 -1
  100. package/dist/components/content/Layout/utils.js +1 -1
  101. package/dist/components/content/Paragraph.js +1 -1
  102. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  103. package/dist/components/content/PrismCode/PrismCode.d.ts +6 -0
  104. package/dist/components/content/PrismCode/PrismCode.js +12 -3
  105. package/dist/components/content/PrismCode/PrismCode.js.map +1 -1
  106. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  107. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  108. package/dist/components/content/Result/Result.js +1 -1
  109. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  110. package/dist/components/content/Tag/Tag.js +1 -1
  111. package/dist/components/content/Text.d.ts +28 -28
  112. package/dist/components/content/Text.js +1 -1
  113. package/dist/components/content/TextItem/TextItem.js +1 -1
  114. package/dist/components/content/Title.js +1 -1
  115. package/dist/components/content/Tree/Tree.js +1 -1
  116. package/dist/components/content/Tree/TreeNode.js +1 -1
  117. package/dist/components/content/Tree/styled.js +1 -1
  118. package/dist/components/content/Tree/tree-index.js +1 -1
  119. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  120. package/dist/components/content/Tree/use-load-data.js +1 -1
  121. package/dist/components/content/highlightText.js +1 -1
  122. package/dist/components/content/use-auto-tooltip.js +1 -1
  123. package/dist/components/data/DataTable/DataTable.js +1 -1
  124. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  125. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  126. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  127. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  128. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -2
  129. package/dist/components/data/ItemTable/ItemTableToolbar.js.map +1 -1
  130. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  131. package/dist/components/data/TableBase/RowCollection.js +1 -1
  132. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  133. package/dist/components/data/TableBase/TableRow.js +1 -1
  134. package/dist/components/data/TableBase/TableView.js +2 -2
  135. package/dist/components/data/TableBase/TableView.js.map +1 -1
  136. package/dist/components/data/TableBase/column-menu.js +1 -1
  137. package/dist/components/data/TableBase/column-tint.js +12 -2
  138. package/dist/components/data/TableBase/column-tint.js.map +1 -1
  139. package/dist/components/data/TableBase/row-menu.js +1 -1
  140. package/dist/components/data/TableBase/styled.js +1 -1
  141. package/dist/components/data/TableBase/types.js +1 -1
  142. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  143. package/dist/components/data/TableBase/use-column-order.js +1 -1
  144. package/dist/components/data/TableBase/use-container-width.js +1 -1
  145. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  146. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  147. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  148. package/dist/components/data/TableBase/use-table-search.js +1 -1
  149. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  150. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  151. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  152. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  153. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  154. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  155. package/dist/components/fields/Checkbox/context.js +1 -1
  156. package/dist/components/fields/ColorInput/ColorInput.js +12 -7
  157. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
  158. package/dist/components/fields/ColorPicker/ColorPicker.js +3 -2
  159. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  160. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.d.ts +8 -2
  161. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.js +14 -6
  162. package/dist/components/fields/ColorSwatch/ColorSwatch.js.map +1 -0
  163. package/dist/components/fields/ColorSwatch/index.d.ts +2 -0
  164. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  165. package/dist/components/fields/ComboBox/ComboBox.js +2 -6
  166. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  167. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  168. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  169. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  170. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  171. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  172. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  173. package/dist/components/fields/DatePicker/DatePickerButton.js +32 -2
  174. package/dist/components/fields/DatePicker/DatePickerButton.js.map +1 -1
  175. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  176. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  177. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  178. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  179. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  180. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  181. package/dist/components/fields/DatePicker/PeriodPicker.js +3 -2
  182. package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
  183. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  184. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  185. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  186. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  187. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  188. package/dist/components/fields/DatePicker/period.js +1 -1
  189. package/dist/components/fields/DatePicker/props.js +1 -1
  190. package/dist/components/fields/DatePicker/utils.js +1 -1
  191. package/dist/components/fields/FileInput/FileInput.js +1 -1
  192. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -2
  193. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  194. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -2
  195. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  196. package/dist/components/fields/Input/Input.js +1 -1
  197. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  198. package/dist/components/fields/ListBox/ListBox.js +1 -1
  199. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -4
  200. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
  201. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  202. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  203. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  204. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  205. package/dist/components/fields/PasswordInput/PasswordInput.js +9 -6
  206. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  207. package/dist/components/fields/Picker/Picker.js +1 -3
  208. package/dist/components/fields/Picker/Picker.js.map +1 -1
  209. package/dist/components/fields/RadioGroup/Radio.d.ts +31 -9
  210. package/dist/components/fields/RadioGroup/Radio.js +57 -14
  211. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  212. package/dist/components/fields/RadioGroup/RadioGroup.js +2 -1
  213. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  214. package/dist/components/fields/RadioGroup/context.js +1 -1
  215. package/dist/components/fields/SearchComboBox/SearchComboBox.js +2 -6
  216. package/dist/components/fields/SearchComboBox/SearchComboBox.js.map +1 -1
  217. package/dist/components/fields/SearchInput/SearchInput.js +18 -16
  218. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  219. package/dist/components/fields/Select/Select.js +3 -6
  220. package/dist/components/fields/Select/Select.js.map +1 -1
  221. package/dist/components/fields/Slider/Gradation.js +1 -1
  222. package/dist/components/fields/Slider/HueSlider.js +15 -4
  223. package/dist/components/fields/Slider/HueSlider.js.map +1 -1
  224. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  225. package/dist/components/fields/Slider/Slider.js +1 -1
  226. package/dist/components/fields/Slider/SliderBase.js +1 -1
  227. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  228. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  229. package/dist/components/fields/Slider/elements.js +1 -1
  230. package/dist/components/fields/Slider/index.js +1 -1
  231. package/dist/components/fields/Switch/Switch.js +1 -1
  232. package/dist/components/fields/TextArea/TextArea.js +1 -1
  233. package/dist/components/fields/TextInput/TextInput.js +1 -1
  234. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  235. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  236. package/dist/components/fields/color/ColorPanel.js +1 -1
  237. package/dist/components/fields/color/channels.js +1 -1
  238. package/dist/components/fields/color/color.js +4 -4
  239. package/dist/components/fields/color/color.js.map +1 -1
  240. package/dist/components/fields/color/context.js +1 -1
  241. package/dist/components/fields/color/index.d.ts +0 -1
  242. package/dist/components/fields/index.d.ts +2 -1
  243. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  244. package/dist/components/form/Form/Field.js +1 -1
  245. package/dist/components/form/Form/Form.js +1 -1
  246. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  247. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  248. package/dist/components/form/Form/SubmitError.js +1 -1
  249. package/dist/components/form/Form/index.js +1 -1
  250. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  251. package/dist/components/form/Form/use-field/use-field.js +1 -1
  252. package/dist/components/form/Form/use-form.js +1 -1
  253. package/dist/components/form/Form/validation.js +1 -1
  254. package/dist/components/form/Label.js +1 -1
  255. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  256. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  257. package/dist/components/form/validation/use-validation-props.js +1 -1
  258. package/dist/components/form/wrapper.js +1 -1
  259. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  260. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  261. package/dist/components/layout/Board/Board.d.ts +35 -5
  262. package/dist/components/layout/Board/Board.js +11 -5
  263. package/dist/components/layout/Board/Board.js.map +1 -1
  264. package/dist/components/layout/Board/BoardProvider.js +1 -1
  265. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  266. package/dist/components/layout/Board/Widget.d.ts +16 -1
  267. package/dist/components/layout/Board/Widget.js +3 -2
  268. package/dist/components/layout/Board/Widget.js.map +1 -1
  269. package/dist/components/layout/Board/WidgetHost.js +92 -17
  270. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  271. package/dist/components/layout/Board/board-context.js +5 -5
  272. package/dist/components/layout/Board/board-context.js.map +1 -1
  273. package/dist/components/layout/Board/board-store.d.ts +1 -0
  274. package/dist/components/layout/Board/board-store.js +2 -2
  275. package/dist/components/layout/Board/board-store.js.map +1 -1
  276. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  277. package/dist/components/layout/Board/grid-core/collision-modes.js +183 -0
  278. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -0
  279. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  280. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  281. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  282. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  283. package/dist/components/layout/Board/grid-core/layout.js +12 -2
  284. package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
  285. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  286. package/dist/components/layout/Board/grid-core/types.d.ts +17 -1
  287. package/dist/components/layout/Board/index.d.ts +2 -2
  288. package/dist/components/layout/Board/index.js +1 -1
  289. package/dist/components/layout/Board/index.js.map +1 -1
  290. package/dist/components/layout/Board/responsive-utils.js +1 -1
  291. package/dist/components/layout/Board/use-board-layout.js +1 -1
  292. package/dist/components/layout/Board/use-board-registry.js +57 -9
  293. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  294. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  295. package/dist/components/layout/Board/use-board-selection.js +1 -1
  296. package/dist/components/layout/Flex.js +1 -1
  297. package/dist/components/layout/Flow.js +1 -1
  298. package/dist/components/layout/Grid.js +1 -1
  299. package/dist/components/layout/Panel.js +1 -1
  300. package/dist/components/layout/Prefix.js +1 -1
  301. package/dist/components/layout/ResizablePanel.js +1 -1
  302. package/dist/components/layout/Space.js +1 -1
  303. package/dist/components/layout/Suffix.js +1 -1
  304. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  305. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  306. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  307. package/dist/components/navigation/Tabs/TabButton.js +2 -29
  308. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  309. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  310. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  311. package/dist/components/navigation/Tabs/TabPicker.js +1 -2
  312. package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
  313. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  314. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  315. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  316. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  317. package/dist/components/navigation/Tabs/styled.js +1 -1
  318. package/dist/components/navigation/Tabs/types.js +1 -1
  319. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  320. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  321. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  322. package/dist/components/other/Calendar/Calendar.js +1 -1
  323. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  324. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  325. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  326. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  327. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  328. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  329. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  330. package/dist/components/other/Calendar/styled.js +1 -1
  331. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  332. package/dist/components/other/NoDataIcon/NoDataIcon.d.ts +37 -0
  333. package/dist/components/other/NoDataIcon/NoDataIcon.js +56 -0
  334. package/dist/components/other/NoDataIcon/NoDataIcon.js.map +1 -0
  335. package/dist/components/other/NoDataIcon/index.d.ts +2 -0
  336. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  337. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  338. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  339. package/dist/components/overlays/Dialog/Dialog.js +4 -3
  340. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  341. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  342. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  343. package/dist/components/overlays/Dialog/DialogTrigger.d.ts +13 -0
  344. package/dist/components/overlays/Dialog/DialogTrigger.js +24 -5
  345. package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
  346. package/dist/components/overlays/Dialog/context.js +1 -1
  347. package/dist/components/overlays/Dialog/context.js.map +1 -1
  348. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  349. package/dist/components/overlays/Modal/Modal.js +1 -1
  350. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  351. package/dist/components/overlays/Modal/Overlay.js +1 -2
  352. package/dist/components/overlays/Modal/Overlay.js.map +1 -1
  353. package/dist/components/overlays/Modal/Popover.js +1 -1
  354. package/dist/components/overlays/Modal/Tray.js +1 -1
  355. package/dist/components/overlays/Modal/Underlay.js +1 -1
  356. package/dist/components/overlays/Notifications/Notification.js +1 -1
  357. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  358. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  359. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  360. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  361. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -2
  362. package/dist/components/overlays/Notifications/OverlayContainer.js.map +1 -1
  363. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  364. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  365. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  366. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  367. package/dist/components/overlays/Notifications/index.js +1 -1
  368. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  369. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  370. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  371. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  372. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  373. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  374. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  375. package/dist/components/overlays/Toast/index.js +1 -1
  376. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  377. package/dist/components/overlays/Toast/useToast.js +1 -1
  378. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  379. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  380. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  381. package/dist/components/overlays/Tooltip/context.js +1 -1
  382. package/dist/components/portal/Portal.js +1 -1
  383. package/dist/components/portal/PortalProvider.js +1 -1
  384. package/dist/components/portal/usePortal.js +1 -1
  385. package/dist/components/shared/DraggableCollection.js +1 -1
  386. package/dist/components/shared/InvalidIcon.js +1 -1
  387. package/dist/components/shared/ValidIcon.js +1 -1
  388. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  389. package/dist/components/status/LoadingAnimation/LoadingAnimation.js.map +1 -1
  390. package/dist/components/status/Spin/Cube.js +1 -1
  391. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  392. package/dist/components/status/Spin/Spin.js +1 -1
  393. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  394. package/dist/data/item-themes.d.ts +1 -1
  395. package/dist/data/item-themes.js +247 -47
  396. package/dist/data/item-themes.js.map +1 -1
  397. package/dist/data/themes.js +1 -1
  398. package/dist/eslint-plugin/defaults.generated.js +2022 -1970
  399. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  400. package/dist/eslint-plugin/index.d.ts +6 -0
  401. package/dist/eslint-plugin/index.js +9 -5
  402. package/dist/eslint-plugin/index.js.map +1 -1
  403. package/dist/eslint-plugin/rules/no-redundant-default-prop.d.ts +17 -0
  404. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +17 -11
  405. package/dist/eslint-plugin/rules/no-redundant-default-prop.js.map +1 -1
  406. package/dist/eslint-plugin/types.d.ts +22 -3
  407. package/dist/i18n/I18nProvider.js +1 -1
  408. package/dist/i18n/createFormatter.js +1 -1
  409. package/dist/i18n/index.js +1 -1
  410. package/dist/i18n/instance.js +1 -1
  411. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  412. package/dist/i18n/locales/en-US/uikit.js +1 -1
  413. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  414. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  415. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  416. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  417. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  418. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  419. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  420. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  421. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  422. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  423. package/dist/i18n/locales.js +1 -1
  424. package/dist/i18n/useFormatter.js +1 -1
  425. package/dist/i18n/useI18n.js +1 -1
  426. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  427. package/dist/icons/AdjustmentsIcon.js +1 -1
  428. package/dist/icons/AiIcon.js +1 -1
  429. package/dist/icons/AreaChartIcon.js +1 -1
  430. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  431. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  432. package/dist/icons/BackwardIcon.js +1 -1
  433. package/dist/icons/BarChartIcon.js +1 -1
  434. package/dist/icons/BellFilledIcon.js +1 -1
  435. package/dist/icons/BellIcon.js +1 -1
  436. package/dist/icons/BooleanIcon.js +1 -1
  437. package/dist/icons/CalendarEditIcon.js +1 -1
  438. package/dist/icons/CalendarIcon.js +1 -1
  439. package/dist/icons/CaretDownIcon.js +1 -1
  440. package/dist/icons/CaretUpIcon.js +1 -1
  441. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  442. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  443. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  444. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  445. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  446. package/dist/icons/ChartBarLineIcon.js +1 -1
  447. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  448. package/dist/icons/ChartBarStackedIcon.js +1 -1
  449. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  450. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  451. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  452. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  453. package/dist/icons/ChartBubbleIcon.js +1 -1
  454. package/dist/icons/ChartDonut2Icon.js +1 -1
  455. package/dist/icons/ChartFunnelIcon.js +1 -1
  456. package/dist/icons/ChartHeatmapIcon.js +1 -1
  457. package/dist/icons/ChartKPIIcon.js +1 -1
  458. package/dist/icons/ChartPie2Icon.js +1 -1
  459. package/dist/icons/ChartScatterIcon.js +1 -1
  460. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  461. package/dist/icons/CheckCircleIcon.js +1 -1
  462. package/dist/icons/CheckIcon.js +1 -1
  463. package/dist/icons/CircleFilledIcon.js +1 -1
  464. package/dist/icons/ClearIcon.js +1 -1
  465. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  466. package/dist/icons/CloseCircleIcon.js +1 -1
  467. package/dist/icons/CloseIcon.js +1 -1
  468. package/dist/icons/CodeIcon.js +1 -1
  469. package/dist/icons/ColumnTotalIcon.js +1 -1
  470. package/dist/icons/CopyIcon.js +1 -1
  471. package/dist/icons/CountIcon.js +1 -1
  472. package/dist/icons/CubeIcon.js +1 -1
  473. package/dist/icons/CubePauseIcon.js +1 -1
  474. package/dist/icons/CubePlayIcon.js +1 -1
  475. package/dist/icons/CurrencyDollarIcon.js +1 -1
  476. package/dist/icons/DangerIcon.js +1 -1
  477. package/dist/icons/DashboardIcon.js +1 -1
  478. package/dist/icons/DatabaseIcon.js +1 -1
  479. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  480. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  481. package/dist/icons/DirectionIcon.js +1 -1
  482. package/dist/icons/DonutIcon.js +1 -1
  483. package/dist/icons/DownIcon.js +1 -1
  484. package/dist/icons/EditIcon.js +1 -1
  485. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  486. package/dist/icons/ExclamationCircleIcon.js +1 -1
  487. package/dist/icons/ExclamationIcon.js +1 -1
  488. package/dist/icons/EyeIcon.js +1 -1
  489. package/dist/icons/EyeInvisibleIcon.js +1 -1
  490. package/dist/icons/FilterIcon.js +1 -1
  491. package/dist/icons/FolderFilledIcon.js +1 -1
  492. package/dist/icons/FolderIcon.js +1 -1
  493. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  494. package/dist/icons/FolderOpenIcon.js +1 -1
  495. package/dist/icons/ForwardIcon.js +1 -1
  496. package/dist/icons/GripVerticalIcon.js +1 -1
  497. package/dist/icons/HierarchyIcon.js +1 -1
  498. package/dist/icons/HierarchyOpenIcon.js +1 -1
  499. package/dist/icons/Icon.js +1 -1
  500. package/dist/icons/InfoCircleIcon.js +1 -1
  501. package/dist/icons/InfoIcon.js +1 -1
  502. package/dist/icons/KeyIcon.js +1 -1
  503. package/dist/icons/LeftIcon.js +1 -1
  504. package/dist/icons/LineChartIcon.js +1 -1
  505. package/dist/icons/LoadingIcon.js +1 -1
  506. package/dist/icons/LockFilledIcon.js +1 -1
  507. package/dist/icons/LockIcon.js +1 -1
  508. package/dist/icons/MoreIcon.js +1 -1
  509. package/dist/icons/NotAllowedIcon.js +1 -1
  510. package/dist/icons/Number123Icon.js +1 -1
  511. package/dist/icons/NumberIcon.js +1 -1
  512. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  513. package/dist/icons/PauseCircleIcon.js +1 -1
  514. package/dist/icons/PauseIcon.js +1 -1
  515. package/dist/icons/PercentageIcon.js +1 -1
  516. package/dist/icons/PieChartIcon.js +1 -1
  517. package/dist/icons/PipetteIcon.js +1 -1
  518. package/dist/icons/PlayCircleIcon.js +1 -1
  519. package/dist/icons/PlayIcon.js +1 -1
  520. package/dist/icons/PlusIcon.js +1 -1
  521. package/dist/icons/ProgressBarIcon.js +1 -1
  522. package/dist/icons/ReloadIcon.js +1 -1
  523. package/dist/icons/ReportIcon.js +1 -1
  524. package/dist/icons/ReturnIcon.js +1 -1
  525. package/dist/icons/RightIcon.js +1 -1
  526. package/dist/icons/RowTotalsIcon.js +1 -1
  527. package/dist/icons/SchemeIcon.js +1 -1
  528. package/dist/icons/SearchIcon.js +1 -1
  529. package/dist/icons/SemanticQueryIcon.js +1 -1
  530. package/dist/icons/SettingsIcon.js +1 -1
  531. package/dist/icons/ShieldFilledIcon.js +1 -1
  532. package/dist/icons/ShieldIcon.js +1 -1
  533. package/dist/icons/SlashIcon.js +1 -1
  534. package/dist/icons/SparklesIcon.js +1 -1
  535. package/dist/icons/SqlIcon.js +1 -1
  536. package/dist/icons/StatsIcon.js +1 -1
  537. package/dist/icons/StopIcon.js +1 -1
  538. package/dist/icons/StringIcon.js +1 -1
  539. package/dist/icons/SubtotalsIcon.js +1 -1
  540. package/dist/icons/SwitchIcon.js +1 -1
  541. package/dist/icons/TableIcon.js +1 -1
  542. package/dist/icons/ThumbsDownIcon.js +1 -1
  543. package/dist/icons/ThumbsUpIcon.js +1 -1
  544. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  545. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  546. package/dist/icons/ThunderboltIcon.js +1 -1
  547. package/dist/icons/TimeIcon.js +1 -1
  548. package/dist/icons/TrashIcon.js +1 -1
  549. package/dist/icons/UnlockIcon.js +1 -1
  550. package/dist/icons/UpIcon.js +1 -1
  551. package/dist/icons/UserGroupIcon.js +1 -1
  552. package/dist/icons/UserIcon.js +1 -1
  553. package/dist/icons/UserLockIcon.js +1 -1
  554. package/dist/icons/ViewIcon.js +1 -1
  555. package/dist/icons/WarningFilledIcon.js +1 -1
  556. package/dist/icons/WarningIcon.js +1 -1
  557. package/dist/icons/wrap-icon.js +1 -1
  558. package/dist/index.d.ts +8 -5
  559. package/dist/index.js +6 -4
  560. package/dist/index.js.map +1 -1
  561. package/dist/probe/canonicalize.js +1 -1
  562. package/dist/probe/css.js +1 -1
  563. package/dist/probe/index.js +1 -1
  564. package/dist/provider.js +1 -1
  565. package/dist/providers/TrackingProvider.js +1 -1
  566. package/dist/providers/navigationAdapter.default.js +1 -1
  567. package/dist/tokens/base.js +1 -1
  568. package/dist/tokens/color-seed.d.ts +44 -0
  569. package/dist/tokens/color-seed.js +48 -0
  570. package/dist/tokens/color-seed.js.map +1 -0
  571. package/dist/tokens/color-theme.d.ts +9 -1
  572. package/dist/tokens/color-theme.js +20 -7
  573. package/dist/tokens/color-theme.js.map +1 -1
  574. package/dist/tokens/colors.js +20 -3
  575. package/dist/tokens/colors.js.map +1 -1
  576. package/dist/tokens/index.d.ts +2 -1
  577. package/dist/tokens/index.js +3 -2
  578. package/dist/tokens/index.js.map +1 -1
  579. package/dist/tokens/layout.js +1 -1
  580. package/dist/tokens/lazy-styles.js +1 -1
  581. package/dist/tokens/palette-config.d.ts +304 -77
  582. package/dist/tokens/palette-config.js +188 -49
  583. package/dist/tokens/palette-config.js.map +1 -1
  584. package/dist/tokens/palette.js +617 -163
  585. package/dist/tokens/palette.js.map +1 -1
  586. package/dist/tokens/shadows.js +1 -1
  587. package/dist/tokens/sizes.js +1 -1
  588. package/dist/tokens/spacing.js +1 -1
  589. package/dist/tokens/typography.js +1 -1
  590. package/dist/utils/ResizeSensor.js +1 -1
  591. package/dist/utils/is-dev-env.js +1 -1
  592. package/dist/utils/modules.js +1 -1
  593. package/dist/utils/promise.js +1 -1
  594. package/dist/utils/raf.js +1 -1
  595. package/dist/utils/random.js +1 -1
  596. package/dist/utils/range.js +1 -1
  597. package/dist/utils/react/RenderCache.js +1 -1
  598. package/dist/utils/react/Slots.js +1 -1
  599. package/dist/utils/react/chain.js +1 -1
  600. package/dist/utils/react/disabledProps.js +1 -1
  601. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  602. package/dist/utils/react/index.js +1 -1
  603. package/dist/utils/react/interactions.js +1 -1
  604. package/dist/utils/react/isTextOnly.js +1 -1
  605. package/dist/utils/react/mapProps.js +1 -1
  606. package/dist/utils/react/mergeProps.js +1 -1
  607. package/dist/utils/react/nullableValue.js +1 -1
  608. package/dist/utils/react/resolveIcon.js +1 -1
  609. package/dist/utils/react/sharedStore.js +1 -1
  610. package/dist/utils/react/useBufferedValue.js +1 -1
  611. package/dist/utils/react/useCombinedRefs.js +1 -1
  612. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  613. package/dist/utils/react/useEventBus.js +1 -1
  614. package/dist/utils/react/useId.js +1 -1
  615. package/dist/utils/react/useIsDarwin.js +1 -1
  616. package/dist/utils/react/useKeySymbols.js +1 -1
  617. package/dist/utils/react/useLayoutEffect.js +1 -1
  618. package/dist/utils/react/useLocalStorage.js +1 -1
  619. package/dist/utils/react/useMergeStyles.js +1 -1
  620. package/dist/utils/react/usePopoverSync.js +1 -1
  621. package/dist/utils/react/useQaProps.js +1 -1
  622. package/dist/utils/react/useViewportSize.js +1 -1
  623. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  624. package/dist/utils/selection.js +1 -1
  625. package/dist/utils/styles.js +1 -1
  626. package/dist/utils/tree.js +1 -1
  627. package/dist/utils/warnings.js +1 -1
  628. package/dist/version.js +3 -3
  629. package/docs/Theming.md +471 -83
  630. package/docs/Usage.md +37 -2
  631. package/docs/components/Root.md +1 -1
  632. package/docs/components/actions/Button.md +9 -3
  633. package/docs/components/actions/ItemAction.md +3 -3
  634. package/docs/components/actions/MenuTrigger.md +54 -2
  635. package/docs/components/actions/SubMenuTrigger.md +2 -2
  636. package/docs/components/content/CopySnippet.md +5 -5
  637. package/docs/components/content/InlineInput.md +1 -1
  638. package/docs/components/content/Item.md +10 -10
  639. package/docs/components/content/ItemBadge.md +2 -2
  640. package/docs/components/content/PrismCode.md +1 -0
  641. package/docs/components/fields/ColorSwatch.md +155 -0
  642. package/docs/components/fields/RadioGroup.md +39 -5
  643. package/docs/components/layout/Board.md +20 -2
  644. package/docs/components/other/NoDataIcon.md +48 -0
  645. package/docs/components/overlays/DialogTrigger.md +3 -2
  646. package/docs/components/status/LoadingAnimation.md +12 -0
  647. package/docs/glaze/api.md +155 -47
  648. package/docs/glaze/methodology.md +15 -13
  649. package/docs/glaze/migration.md +36 -0
  650. package/docs/glaze/okhst.md +4 -0
  651. package/docs/tasty/ai-agents.md +3 -0
  652. package/docs/tasty/configuration.md +1 -0
  653. package/package.json +6 -3
  654. package/dist/components/fields/color/ColorSwatch.js.map +0 -1
package/README.md CHANGED
@@ -129,7 +129,7 @@ const StatusBadge = tasty({
129
129
 
130
130
  ### Prerequisites
131
131
 
132
- - Node.js >= 22.0.0
132
+ - Node.js 24 (see `.nvmrc`)
133
133
  - pnpm >= 10
134
134
 
135
135
  ### Scripts
package/dist/CHANGELOG.md CHANGED
@@ -1,5 +1,425 @@
1
1
  # @cube-dev/ui-kit
2
2
 
3
+ ## 0.164.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - A `baseColor` now contributes its **saturation** as well as its hue, and `baseSaturation` follows the accent's chroma however that chroma was expressed.
8
+
9
+ `baseColor` previously contributed hue only, which left a hole: picking a base color set which way the greys leaned but not how far, so the chrome's chroma still came from the accent seed and had nothing to do with the color chosen. Its **tone** is still discarded — the chrome's own lightness ladder is the design.
10
+
11
+ ```ts
12
+ setPaletteConfig({ baseColor: "#6e7076" }); // near-grey in, near-grey chrome out
13
+ setPaletteConfig({ baseColor: "#FFD400" }); // saturation 100 in, clipped to 50
14
+ ```
15
+
16
+ The derived saturation is **clipped to `MAX_BASE_SATURATION`** (`50`, newly exported). Naming a base color says "the chrome _is_ this color", so it lands near it rather than at the 12% share `baseSaturation` otherwise inherits — but a fully saturated chrome stops being chrome, and the base colors converge above `25` anyway, so the clip costs nothing that was still moving.
17
+
18
+ `baseSaturation`'s default also changes shape. Unset, it takes `0.12` of whatever the **accent zone** carries — the `saturation` seed, or an `accentColor`'s own chroma when one is set:
19
+
20
+ ```
21
+ input.baseSaturation
22
+ ?? (baseColor ? min(baseColor.saturation, 50)
23
+ : (accentColor?.saturation ?? saturation) * 0.12)
24
+ ```
25
+
26
+ Reading the accent color there is the one place a brand color reaches the base zone, and it has to: without it, a near-grey brand left the chrome carrying 12% of a saturation nobody asked for. Nothing here touches the palette-level `saturation`, so the status themes still inherit exactly what they did and the guarantee that a brand color cannot re-chromatise them is intact.
27
+
28
+ The shipped palette is unchanged: with no color seed the expression is `saturation × 0.12` as before, and the snapshot is byte-identical.
29
+
30
+ - [#1333](https://github.com/cube-js/cube-ui-kit/pull/1333) [`cd07258c`](https://github.com/cube-js/cube-ui-kit/commit/cd07258cf9be82dc5139ff8664c69416a733540d) Thanks [@tenphi](https://github.com/tenphi)! - `Board`: scoped drag grid lines, a corner resize-grip placement, and collision modes for the free grid.
31
+
32
+ - **`showGridLines="drag"` now scopes the grid to the board taking part in the gesture** — the board owning the drag (its source, or whichever board the widget is currently over) or resizing one of its own widgets. Previously any drag lit up every board sharing a `Board.Provider`, including boards the widget could not land in. The old behaviour is still available, now opt-in, as `showGridLines="any-drag"`, which advertises every board as somewhere to land.
33
+ - **`resizeGripPlacement`** (`'inside' | 'corner'`, default `'inside'`) on `Board` and `Board.Widget` positions the corner resize grips. `'corner'` centres each grip on the widget's corner — drawn outside the widget box, which clips its own content — so it lines up with a control centred on the opposite corner. The grip's hit-zone moves out with it, so the half that overhangs is grabbable and hovering it keeps the grip revealed. Edge grips are unaffected.
34
+ - **`collisionMode`** (`'revert' | 'downscale' | 'swap'`, default `'revert'`) on `Board` resolves a drop the grid would otherwise refuse, where a collision blocks a move (`compact="free"`, or `preventCollision`). `'downscale'` shrinks the widget into the free space at the drop cell; `'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, and falls back to `'downscale'` then `'revert'`. It never displaces more than that one widget, a drop straddling two widgets trades with one rather than refusing, and dragging back retraces the original arrangement. No mode ever grows a widget, and arrow keys honour the mode without ever resizing anything.
35
+
36
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - `ColorSwatch` is a component of its own, with sizes and automatic fitting.
37
+
38
+ It was already exported — as an implementation detail of the color fields, with no size of its own and no docs. It now lives in `src/components/fields/ColorSwatch/`, ships stories and documentation, and takes a `size`:
39
+
40
+ ```jsx
41
+ <ColorSwatch color="#7a4dbf" /> // tracks the control around it
42
+ <ColorSwatch color="#7a4dbf" size="large" /> // 28px
43
+ ```
44
+
45
+ - **`size`** — `small` / `medium` / `large` = `20px` / `24px` / `28px`.
46
+ - **Left unset, the swatch sizes itself to its host.** `Item`, `Button` and the text inputs publish their height as the `$size` custom property, so a swatch in an `icon`, `rightIcon`, `prefix` or `suffix` slot lands `8px` inside it — `20px` in a `small` control, `24px` in a `medium` one, `32px` in a `large` one — with nothing passed between the two. Outside a control it falls back to `medium`.
47
+
48
+ Nothing the kit renders changes size. `ColorInput` and `ColorPicker` keep the fixed `20px` swatch they have always drawn, at every field size: it reads as a value the field is showing rather than as part of the control, and a text input hangs its prefix off the border with no padding of its own, so a tracking swatch in a large field would sit against the edge. Automatic fitting is for a swatch you place yourself, where the host has the padding that makes it work.
49
+
50
+ The import path `@cube-dev/ui-kit` is unchanged.
51
+
52
+ - [#1335](https://github.com/cube-js/cube-ui-kit/pull/1335) [`f777bbb3`](https://github.com/cube-js/cube-ui-kit/commit/f777bbb3c809484932b8cd6c2b9c15857e7ba7a8) Thanks [@solarrust](https://github.com/solarrust)! - `PrismCode` and `CopySnippet` take an `isWrapped` prop that soft-wraps long content instead of scrolling it sideways.
53
+
54
+ By default both components keep each line on one line and scroll horizontally, which buries long error messages and logs off to the right. `isWrapped` lays the content out on multiple lines instead: unbreakable runs like URLs, tokens and identifiers break too (`overflow-wrap: anywhere`), not just spaces. On `CopySnippet` the block additionally grows vertically to fit — so even a single very long line is fully readable rather than clamped to the collapsed height — and the prop is forwarded to the inner `PrismCode`, which owns the wrapping itself.
55
+
56
+ ```jsx
57
+ <PrismCode code={longErrorMessage} language="bash" isWrapped />
58
+ <CopySnippet code={longErrorMessage} language="bash" isWrapped />
59
+ ```
60
+
61
+ On `CopySnippet` it is a different axis from `nowrap` — `nowrap` collapses real newlines into one scrolling line, `isWrapped` breaks long lines — and `nowrap` wins when both are set. The copy button and syntax highlighting are unchanged.
62
+
63
+ - [#1332](https://github.com/cube-js/cube-ui-kit/pull/1332) [`ac2ec331`](https://github.com/cube-js/cube-ui-kit/commit/ac2ec331a5d5b5d6b7af4849b0870b41f6637324) Thanks [@tenphi](https://github.com/tenphi)! - `current` moves from the `type` axis to the `theme` axis on `Button`, `Item` (and `ItemButton`), `Item.Action` and `ItemBadge`. It was never a shape: it names where the colors come from — the inherited `currentcolor` rather than a brand ramp — which is the question `theme` answers. As a type it occupied the slot that decides emphasis, so picking `current` meant giving up the choice between a filled button, an outlined one and a bare label.
64
+
65
+ On the `theme` axis it composes instead, and every type now has a `current` flavour:
66
+
67
+ - `item` — the old `Item` shape: no border, nothing painted at rest, the fill stepping in on hover, pressed and selected.
68
+ - `clear` — the same ramp plus the focus ring a standalone control needs. The default for `Item.Action` and `ItemBadge`.
69
+ - `outline` — the old `Button` shape: a resting `#current.03` chip inside a `#current.08` border.
70
+ - `outline-2` — `outline` for a container that is already painting something. The brand themes swap an opaque base (`#surface-3` for `#surface-2`); `current` has no opaque base to swap, so the same intent is carried by roughly doubling the tint at every step.
71
+ - `primary` — the high-emphasis control, and the one flavour that fills opaquely, like every other theme's `primary`: the fill is the inherited color at full opacity and the label is punched out of it with the new `#current-fill` token, which defaults to `#surface` — the page background, which is always the opposite of the text painted on it and so follows the scheme for free. Hover and pressed lay a translucent `#black` over the same base, since an arbitrary color has no lighter or darker sibling to step to the way the brand ramps walk `accent-surface` to `-2` and `-3`. The rim comes from the same token at `.25` — every other `primary` rims its fill with `accent-surface-border`, cr 1.48 against it, and this measures 1.82 in light and 1.55 in dark. Disabled swaps the rim to `#surface-text.2`, which holds against a `.4` chip that a `#surface` rim would wash into. The label is painted with `-webkit-text-fill-color` rather than `color`: `#current` compiles to the literal `currentcolor`, which in `fill` resolves against the element's own `color`, so setting `color` to the label token would make the fill resolve to the label color and paint a white pill with a white label.
72
+
73
+ `#current-fill` is a real color token with a default, not a bare custom property, so it takes the alpha suffix (`#current-fill.5` is the disabled label) and a container overrides it with one declaration — `styles={{ '#current-fill': '#fixed-dark' }}` — moving the label, the icon slots and the rim together. It exists for the one container the `#surface` default is wrong for: a container whose own text color IS the page paints `#white`, which IS `#surface` in light mode, so an unaided label measures cr 1.00 against its own chip. Its own fill is the right value there, since it contrasts with its own text by construction. Ordinary containers set nothing.
74
+
75
+ - `link` — no chip at all. The brand themes intensify from `accent-text-soft` to `accent-text` on hover; here "soft" is the inherited color at `.8` and "strong" is it at full opacity.
76
+ - `card` — the static panel: a `#current.05` fill inside a `#current.2` border (`Item` only).
77
+
78
+ `current.outline` and `current.item` are byte-identical to the old `Button` and `Item` flavours, so nothing that used `type="current"` changes appearance.
79
+
80
+ The top step of each ramp stops at `#current.24` in light. The dark counterpart is not authored: each `@dark` step is solved so its OKHST tone delta from the surface matches the light step's, which lands the two schemes on the same chip-vs-page contrast (1.084 / 1.083 at hover, 1.959 / 1.961 at the top step). That works out _lower_ than the light alpha throughout — `.031 / .046 / .13 / .175 / .221` against `.04 / .06 / .18 / .24 / .3` — because near the dark end of the scale a small sRGB move is a large perceptual one, so the same tint reads stronger on a dark surface than on a light page.
81
+
82
+ ### Migration
83
+
84
+ **`type="current"` is removed with no runtime fallback.** It resolves to no variant and falls back to base styles, the same as any other unknown type — there is no mapping and no deprecation warning. The spelling shipped one release ago and has no consumers outside the kit, so this is a clean break rather than a deprecation:
85
+
86
+ | Old | New |
87
+ | ------------------------------ | ------------------------------------------------------- |
88
+ | `<Button type="current">` | `<Button theme="current">` (type defaults to `outline`) |
89
+ | `<Item type="current">` | `<Item theme="current">` (type defaults to `item`) |
90
+ | `<Item.Action type="current">` | drop it — `current` is already the default theme |
91
+ | `<ItemBadge type="current">` | drop it — `current` is already the default theme |
92
+
93
+ `Item` accepts `theme="current"` with every type except `header`, which stays theme-agnostic; the warning that fired for `type="current"` with any theme but `default` is gone, since there is no longer such a pair to reject.
94
+
95
+ ### `Item.Action` / `ItemBadge` defaults
96
+
97
+ `type` now defaults to `clear` and `theme` to `current`, and neither is read from `ItemActionContext` any more — the two axes are independent, so a shape no longer implies a color source and vice versa. Both defaults are plain values the lint registry can prove, which the previous `theme` entry (`skip: 'context'`) was not.
98
+
99
+ This changes one case: an action that named a `type` but no `theme` used to inherit the host row's theme, and now takes the host's color through `currentcolor` instead. Inside a themed row the two are close by construction — a `danger` row paints `#danger-accent-text`, which is what the action then mixes from — but the chip is an alpha tint rather than the brand ramp. Pass `theme="default"` (or any other theme) to opt back into a fixed palette.
100
+
101
+ `Banner` is the one in-repo consumer that needed a matching edit. Its actions ask for `type="outline"` and then cleared the border, because back then `outline` meant `note.outline` and friends — whose border is the opaque `#note-border`, a pale line built for a `#surface-2` chip on a light page and plainly wrong on a saturated banner. The fill carried the chip on its own there. On the `current` theme the border is `#current.08` mixed from the banner's own white label, and the fill is a 3% tint that cannot carry a chip by itself, so clearing the border left the action invisible. The override is gone and the type renders as designed.
102
+
103
+ `ItemActionContext` no longer reaches the DOM at all beyond `isDisabled`. An interim version of this branch published the host theme as a `data-surface` attribute so the `current` ramp could pick per-surface alphas for the `special` theme's fixed dark-purple surface; that is gone, because only `ItemAction` and `ItemBadge` ever set the attribute, so `Button` and `Item` on the same surface silently fell back to the light ramp.
104
+
105
+ ### Two nesting fixes
106
+
107
+ Both fall out of `current.primary` keeping `color` as the fill rather than the label:
108
+
109
+ - The `Actions` slot is recolored to the label, like the icon slots already were — a nested `Item.Action` defaults to `theme="current"` and mixes its own label from the `currentcolor` it inherits, so without this it took the chip color and vanished into it.
110
+ - `ItemButton`'s `ActionsWrapper` reproduces the label rather than the chip, for the same reason on the sibling path.
111
+
112
+ ### Also
113
+
114
+ - `current` is registered in `TastyThemeNames`, so `theme="current"` autocompletes on every tasty component.
115
+ - New `CurrentStates` stories on `Button` and `Item` sweep every type and state on the theme, inside containers that paint their own text color; the context sweeps are renamed `CurrentTheme`.
116
+
117
+ - [#1334](https://github.com/cube-js/cube-ui-kit/pull/1334) [`ffd1c7b5`](https://github.com/cube-js/cube-ui-kit/commit/ffd1c7b56ab4f2be9557841f7884c68ace3646ea) Thanks [@tenphi](https://github.com/tenphi)! - `LoadingAnimation` is retuned to sit next to the current monochrome `CubeLogo`, and the empty-crate illustration Cube Cloud has been carrying locally ships as `NoDataIcon`, drawn from the same three tokens.
118
+
119
+ **The faces are near-neutral now.** `loading-face-1..3` used to take a fraction of the _brand_ seed saturation (0.3 / 0.62 / 0.66), which put the shadowed face at chroma **0.0676** — eight times `border` — so a spinner rendered as a purple gradient beside a logo drawn in `currentColor`. They now take `baseChroma(0.2)`, the same normalised share the neutral chrome takes (`border`, `placeholder`, the text ramp), landing at **0.0059 / 0.0161 / 0.0248**. The brand hue still carries, as a tint rather than as a color, and still follows a re-seeded palette.
120
+
121
+ **Contrast, not tone, is the spec.** A relative tone delta is uniform on the OKHST scale, but the dark scheme resolves it inside the `darkTone` window, which compressed the ramp to ~75% of its light span. Measured against `surface`:
122
+
123
+ | | face-1 | face-2 | face-3 |
124
+ | ------------- | ------ | ------ | --------- |
125
+ | light, before | 1.063 | 1.320 | 1.915 |
126
+ | dark, before | 1.053 | 1.264 | **1.735** |
127
+ | light, after | 1.201 | 1.653 | 2.409 |
128
+ | dark, after | 1.212 | 1.666 | **2.424** |
129
+
130
+ Glaze has no per-color `darkTone`, so the intent moves into a WCAG floor against `surface` and each scheme solves for it. The authored `tone: '-2'` is deliberately short of every floor, so all three faces are pinned by the ratio rather than by a delta that means something different in each scheme — light and dark now agree to within 1%, and the whole ramp is roughly a third stronger than it was (Oklab ΔL 0.271 in light, 0.231 in dark, against 0.204 / 0.154).
131
+
132
+ WCAG rather than APCA, against the grain of the accent tokens: APCA's low-contrast clamp scores every step of a ramp this subtle as Lc 0, so it cannot express the difference between these three faces at all. Polarity-blindness — the reason APCA wins for text — costs nothing for a decorative fill whose only job is to separate from the page.
133
+
134
+ High contrast used to be _identical_ to the normal tier here, because an unconstrained tone delta had nothing to escalate. The `[1.35, 2.1, 3.2]` HC entries roughly double each step's distance from the page.
135
+
136
+ **`NoDataIcon`** is the isometric open crate used for empty tables and empty lists, moved out of `cubejs-enterprise` and onto the shared tokens — the local copy hard-coded `#e5e5ec` / `#b4b4c5` / `#69697c` and re-derived a dark variant in JS on every scheme change.
137
+
138
+ It ships as an **illustration component** alongside `CubeLogo`, not as a member of the icon set, because it is not an icon in the two ways that matter: it is a three-tone drawing rather than a `currentColor` glyph (so it ignores `color` — flattening the faces to one tone loses the box), and it is drawn full-bleed rather than inset in a 24×24 grid (so it belongs at `size="8x"` and up, not inline with text). It is still built on `Icon`, so sizing and style props behave exactly as they do for one.
139
+
140
+ The token names stay `loading-face-*` so Cube Cloud's theme color map keeps resolving; they now cover both pieces of artwork, and the recipe comment says so.
141
+
142
+ - [#1326](https://github.com/cube-js/cube-ui-kit/pull/1326) [`aa455803`](https://github.com/cube-js/cube-ui-kit/commit/aa4558037e8deceb34694c735c4931772f15e95b) Thanks [@tenphi](https://github.com/tenphi)! - `ItemAction` / `ItemBadge` now default to the inherited-color `current` flavour and stop mirroring the host row's `type` from context. (A later change in this release moves `current` from the `type` axis to the `theme` axis, so the default is spelled `theme="current"` with `type="clear"` — see "`current` moves from the `type` axis to the `theme` axis". The behaviour described here is unchanged by that move.) `current` derives every color from the inherited `currentcolor`, so one type covers every host type × theme combination that the context mapping used to enumerate — and, because `currentcolor` is inherited rather than resolved once, an action also follows its row through hover, selected and disabled instead of holding a fixed palette. The mapping in `ItemActionProvider` that folded `item` / `outline` / `outline-2` / `header` / `card` onto `clear` is gone.
143
+
144
+ `ItemActionContext` stays. It still carries `disableActionsFocus`, `isDisabled`, the `theme`, and `type` — the last only for its _presence_, which drives the `context` mod that collapses an action's side margins. The provider's signature is unchanged, so no call site moved.
145
+
146
+ Passing an explicit `theme` opts an action out of the inherited color and into that palette.
147
+
148
+ Supporting changes:
149
+
150
+ - **Selection reads as a filled chip.** Every other type marks `isSelected` with a brand _hue_ — an accent-tinted fill under an accent label — and `current` has one inherited color to work with, so it cannot. Alpha is the only channel left, and the neutral types' `.09` step read as a slightly dirty background rather than an "on" state, so a selected `ItemAction` / `ItemBadge` looked unselected. Selection now jumps clear of the interaction steps (`.18` in light) instead of continuing them, while hover and press stay subtle so a row full of actions is not busy. The dark scheme takes the same jump, scaled by the tone match described below.
151
+ - **A scheme-aware alpha ramp.** Unlike the brand tokens, `#current` alphas do not adapt to the color scheme: the same tint is not the same step in light and dark. Each step therefore carries a base entry for light and an `@dark` counterpart, the dark one _derived_ — solved so its OKHST tone delta from the surface matches the light step's, which is also what puts the chip on the light step's contrast against the page. The direction is counter-intuitive: the dark alphas come out lower, because near the dark end of the scale a small sRGB move is a large perceptual one. Each step lives in its own custom property rather than inline in `fill`, because both ramps in one state-map would put twelve alpha values where Tasty's `mergeEntriesByValue` pass coalesces equal value strings into one OR-entry at the group's max priority and breaks negation against lower-priority rules.
152
+ - **`ItemAction` regains a focus ring.** `CURRENT_ITEM_STYLES` follows the `*_ITEM_STYLES` convention of leaving focus to the collection that owns the row, which is wrong for a focusable action, so the ring came back on the action itself.
153
+ - **`ItemButton` paints its actions' color.** It renders actions as a sibling of the button rather than inside it — deliberately, so they are not nested in a `<button>` — so `currentcolor` reached them from the page instead of the row: a `danger` row handed its actions neutral text, and a `special` row handed them the page's _dark_ text to tint on a dark purple surface. `ActionsWrapper` now carries the row's resting color, derived from the variant map rather than restating the palette.
154
+ - **One variants map.** `Item`'s inline `theme.type` → styles object is now the exported `ITEM_VARIANTS`, shared with the color projection above so the two cannot drift.
155
+
156
+ Every clear and trigger button across the field components now relies on that default instead of pinning a `type` or a validation `theme`: `Select`, `Picker`, `FilterPicker`, `ComboBox`, `SearchComboBox` and `SearchInput` clear buttons, `PasswordInput`'s masking toggle, `ColorInput`'s pipette, `DatePicker`'s calendar button and the ComboBox / SearchComboBox triggers. Each one now takes the color of the field it sits in, so it follows a custom theme rather than staying pinned to `default.clear`.
157
+
158
+ Where that changes rendering, it changes it toward matching the field's own text:
159
+
160
+ - `Picker` / `FilterPicker` clear buttons are unchanged — their trigger text already carries validation state, so the inherited color equals what the explicit theme produced.
161
+ - `ComboBox` / `SearchComboBox` / `SearchInput` clear buttons and the ComboBox trigger move from the fixed `danger.clear` label to the input's own `#danger-accent-text` when invalid. The trigger previously stayed neutral beside red input text.
162
+ - `PasswordInput`'s toggle now tints with the field instead of always rendering neutral.
163
+ - `Select`'s clear button no longer turns red when the field is invalid. Its trigger keeps **neutral** label text in that state, so the button now matches its own field, and the red border still signals invalidity. `Picker` and `FilterPicker` are also `Item`-based but do tint their trigger text — that inconsistency lives in `Select` and is worth fixing there rather than being masked by a themed clear button.
164
+
165
+ `ItemAction` / `ItemBadge` `type` therefore returns to a plain default in the lint registry. The `skip: 'context'` classification it was given existed because the prop resolved through `ItemActionProvider`; it no longer does. `isDisabled` is still context-resolved and still skipped.
166
+
167
+ - [#1327](https://github.com/cube-js/cube-ui-kit/pull/1327) [`5bebe7d1`](https://github.com/cube-js/cube-ui-kit/commit/5bebe7d10fa2d8abc3d80c71c004f74ba970a7f9) Thanks [@tenphi](https://github.com/tenphi)! - `MenuTrigger` / `DialogTrigger`: an action can now hand focus off to the surface it opens. Closing either overlay used to return focus to its trigger unconditionally — an item or button whose action opened a panel, a dialog or an inline editor lost focus to the trigger a tick later, so consumers had to out-race the overlay by re-focusing on every animation frame over a several-hundred-millisecond window. The restore is now skipped whenever focus already sits outside the closing overlay, so a single `focus()` from the opened surface's mount effect holds.
168
+
169
+ Nothing changes when the action moves focus nowhere: focus still inside the overlay (the pressed control keeps it through the exit animation) or dropped to `<body>` returns to the trigger as before. A clicked control outside the overlay also keeps focus now instead of having it yanked to the trigger. For `DialogTrigger` this affects the `modal`, `tray`, `fullscreen`, `fullscreenTakeover` and `panel` types; `popover` already restored through `Dialog`'s own `FocusScope`, which declines to restore when focus moved.
170
+
171
+ Both triggers also gain a `shouldRestoreFocus` prop (default `true`) for surfaces that claim focus _later_ than the restore — after an async load or an entry animation — where the trigger would otherwise take focus first and flash. It silences every restore path the trigger owns: `MenuTrigger`'s popover `FocusScope` as well as its manual restore, and for `DialogTrigger` the `Dialog`'s own `FocusScope` (reached through `DialogContext`, so a `Dialog` rendered outside a trigger keeps restoring focus as before).
172
+
173
+ `Tabs`: the rename-from-menu flow no longer runs a refocus pass. Picking "Rename" used to re-focus the inline-edit input on an animation frame and again at 50/200/400ms purely to survive the closing menu; the input's own `FocusScope autoFocus` is now enough. Behaviour is unchanged — rename still lands in a live editing session, in every context-menu mode.
174
+
175
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - Add color-valued palette seeds. `accentColor` and `baseColor` accept a real color string — hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`, `oklch()` — so a brand can be given as the color you have rather than as a hue you had to derive:
176
+
177
+ ```ts
178
+ setPaletteConfig({ accentColor: "#2F5BFF", baseColor: "#7A7269" });
179
+ ```
180
+
181
+ The two are deliberately asymmetric. `accentColor` contributes hue, saturation and **tone**, and the tone is the point: the brand fill was previously authored as a fixed tone step off white, so every accent hue landed at roughly the same lightness and a yellow brand came out olive. `baseColor` contributes hue and saturation but **not tone**, because the chrome's own lightness ladder is the design — a base color says which way the greys lean and how far, not how dark they are.
182
+
183
+ The color is handed to Glaze's `from`, so the **light, normal-contrast** variant reproduces it exactly — the fill, the link and the icon all render the value you passed. Dark and high contrast adapt as every other color does. Two APCA floors apply everywhere, both Lc 45 — one against the page so the button reads as a shape, one against the `#white` label it carries — and both are floors rather than targets: `#7A4DBF` clears them and is emitted untouched, while a light brand darkens only as far as the nearer one requires. They are APCA rather than WCAG deliberately, and the consequence is worth stating: **an emitted fill can sit below WCAG 3:1** (`#0EA5E9` lands at 2.77:1 and is correct there). High contrast escalates the page floor to Lc 60 and stops, because past that the window the two floors share closes and the label disappears off its own fill.
184
+
185
+ Because the accent family now carries its own chroma, a brand color no longer raises the palette-level `saturation` to reach it — so it cannot leak into the **status themes**. `#danger-accent-surface` is now identical whatever the brand is. (The neutral chrome is the one deliberate exception: `baseSaturation` takes a 12% share of the brand's own chroma, capped by the seed, so a near-grey brand leaves near-grey chrome. See the base-color changeset.) Status themes also do not inherit the literal itself (`extend()` copies defs, so an inherited `from` would make a danger button the brand color outright); `special` does follow it, being the brand-on-dark CTA.
186
+
187
+ `ResolvedPaletteConfig` gains `accentTone`, and `colorSeed()` is exported for reading hue / saturation / tone off a color directly. The shipped palette is unchanged — a config with no color seed resolves bit for bit as before.
188
+
189
+ Make `pastel` and `saturation` two explicit paths rather than two knobs that fight. Pastel is one flat chroma ceiling, so a second saturation scale on top of it only undid the evenness it exists for — under `pastel` the seed is now pinned to `100`. Setting a `saturation` therefore **turns pastel off**, since tuning a saturation is the non-pastel path by definition, so `setPaletteConfig({ saturation: 55 })` keeps resolving to 55 exactly as before. An explicit `pastel: true` written next to a saturation wins and the saturation is ignored with a dev warning, but it is kept rather than dropped, so turning pastel back off restores the number.
190
+
191
+ Fix the brand fill ramp collapsing in high contrast under a color seed: `accent-surface` and `accent-surface-2` previously solved to the same value there, so the hover step disappeared.
192
+
193
+ The `Theme Builder` story gains a **Seeded by** switch that flips the whole palette between numeric seeds and color seeds, and swatches of the two tokens a color seed's tone reaches — `Accent Fill` and `Accent Text` — which is what makes the pastel chroma cap visible rather than mysterious.
194
+
195
+ - [#1336](https://github.com/cube-js/cube-ui-kit/pull/1336) [`acb9ab59`](https://github.com/cube-js/cube-ui-kit/commit/acb9ab5966499a0b061310b0912de66bac1c1512) Thanks [@tenphi](https://github.com/tenphi)! - Give every palette zone one seed, and let a status theme take a color.
196
+
197
+ **BREAKING (`setPaletteConfig` / `<Root palette>` / `renderColorTokens` / `renderPaletteTokens`).** The six flat seed fields collapse into one `PaletteSeed` per zone — a color string, or `{ hue?, saturation? }`:
198
+
199
+ | was | is |
200
+ | ---------------------------------------- | --------------------------------------------------- |
201
+ | `hue`, `saturation` | `accent: { hue?, saturation? }` |
202
+ | `accentColor` | `accent: '#…'` |
203
+ | `baseHue`, `baseSaturation` | `base: { hue?, saturation? }` |
204
+ | `baseColor` | `base: '#…'` |
205
+ | `themes.<status>: { hue?, saturation? }` | unchanged, and now also `themes.<status>: '#…'` |
206
+ | `themes.code: { saturation? }` | unchanged — it takes no hue and no color, by design |
207
+
208
+ ```ts
209
+ setPaletteConfig({
210
+ accent: "#2F5BFF",
211
+ base: "#7A7269",
212
+ themes: { danger: "#b91c1c", success: { hue: 150 } },
213
+ });
214
+ ```
215
+
216
+ The union **is** the exclusivity. A zone was always seeded either by a color or by numbers, but the old shape let you write both and needed a precedence rule to settle it (`hue` outranked `accentColor`). Now it cannot be written, so there is no rule to learn — and a patch that switches form replaces rather than merges. The one capability this removes is the hybrid that precedence allowed: `resolvePaletteConfig({ hue: 30 })` over a stored brand color previewed "this brand, rotated, tone intact". A numeric seed now takes the zone over outright.
217
+
218
+ `ResolvedPaletteConfig` keeps its flat shape — `hue`, `baseHue`, `saturation`, `baseSaturation`, `accentColor`, `accentTone`, `accentSaturation` — so anything reading the resolved config is unaffected. Its four status entries gain `color` and `colorTone`. `PaletteThemeSeed` is replaced by `PaletteSeed`; `PaletteNumericSeed` and `ResolvedThemeSeed` are new.
219
+
220
+ **Status themes can now be seeded by a color**, which is what the union was blocking. `themes.danger: '#b91c1c'` renders that red on `#danger-accent-surface` — reproduced in light at normal contrast, adapting in dark and high contrast — and reaches `#danger-accent-text`, `-text-soft` and `-icon`. It inherits the brand path's softened APCA floors (Lc 45 against the white label, Lc 25 against the page) in place of the white-anchored ladder's `['AA','AAA']`, and the same tone cap, so a pale status color is pulled down rather than shipped as a white `type="primary"` label on white.
221
+
222
+ One rule differs from the accent's, deliberately: **a status color's chroma becomes that theme's seed.** An accent color's does not, because all four status themes inherit the accent's saturation and raising it would re-chromatise every one of them; nothing inherits from a status theme, so there is nothing to protect. Moving the seed is also what holds the theme together — its tinted banner surface, border and text ramp are authored as factors of the seed (`0.2`, `0.3`, `0.25`), so leaving it at `100` beside a muted fill would give a fully tinted banner under a washed-out button. Moving it keeps the shipped `1.0 : 0.2 : 0.3 : 0.25` ratio exactly.
223
+
224
+ Two consequences worth stating. A muted `saturation` _beside_ an accent color is no longer expressible — a color leaves the inherited seed at its default, so mute the status themes individually if you want that. And the legacy `#danger` / `#success` / `#warning` / `#note` aliases resolve to `#<theme>-accent-surface`, so a status color moves every one of them across a consuming app; that is the point, but it is the blast radius.
225
+
226
+ The Theme Builder's **Color** tab now covers all six zones: each status chip opens on a color field with its hue and saturation sliders gone, entering the tab converts the four status themes to the fill each is already emitting rather than to a sample hex, and leaving it pins their hues back. The shipped palette is unchanged — a config with no color seed resolves bit for bit as before.
227
+
228
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - Add `surfaceMode: 'neutral' | 'tinted'` and a separate `baseSaturation` seed.
229
+
230
+ A neutral `surface` sits at the extreme of the tone scale — pure white in light — and chroma needs distance from the extreme to exist at all, so on a light page the surface was white whatever saturation the palette carried. `surfaceMode: 'tinted'` moves the whole surface ramp two tones inward, which is the room the base hue needs to land on the page itself:
231
+
232
+ ```ts
233
+ setPaletteConfig({ surfaceMode: "tinted", baseSaturation: 25 });
234
+ ```
235
+
236
+ Everything below `surface` is positioned relative to it, so the ladder, the borders and the text ramp follow, and the text's `['AA','AAA']` floors re-solve against the new background rather than drifting. The `code-*` family's mirrored surface tracks it too — it exists to be the page.
237
+
238
+ The **tinted** surfaces move with it as well. A status theme's `surface`, and a runtime tint's from `getColorTheme()`, is an offset from the page's rather than an absolute tone — and that offset is exactly the two tones `tinted` shifts by, so anchored absolutely they would land on the page's own new tone and a `note` banner would stop reading as a banner. They keep their separation in both schemes, and pick up a little more chroma for being further from the extreme.
239
+
240
+ `baseSaturation` is the base zone's own saturation seed, opening the same seam `baseHue` already opens: the chrome is the one family whose job is _not_ to look like the brand. It is on the same 0–100 scale as `saturation`, and **the shipped chrome is `12`**, so the interesting range is the low end; the base colors keep their proportions to one another until the highest of them saturates around `25`.
241
+
242
+ - Left unset it is `0.12` — `surface`'s own factor — of whatever the accent zone carries, so an untouched palette resolves exactly as before and a muted `saturation` still mutes the chrome.
243
+ - Unlike `saturation`, writing it does **not** turn `pastel` off: how much hue the chrome carries says nothing about which chroma space the palette is in.
244
+
245
+ Both are shipped defaults-off: `surfaceMode` defaults to `'neutral'` — the surface at the end of the tone scale, which is exactly what a neutral one is — and the resolved palette is unchanged token for token.
246
+
247
+ ### Patch Changes
248
+
249
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - A pinned brand color is held to an APCA floor instead of a WCAG ratio, which softens the constraint where it was over-tight.
250
+
251
+ Custom color mode only. The shipped palette is untouched — it runs the `null` accent arrangement, whose `['AA','AAA']` floors are unchanged and still snapshotted.
252
+
253
+ WCAG 2.x is polarity-blind, so the old `[3, 7]` meant two very different things depending on the scheme. Measured with Glaze's own `apcaContrast` across 12 hues at 30° steps, the fill sitting exactly at the old floor comes out at **Lc 56.2 in light** (55.8–56.5) but only **Lc 23.3 in dark** (22.7–24.4). Hue is not a factor — the spread is under 2 Lc across the whole wheel — polarity is. One number was therefore 2.4× stricter in light than in dark, which is why light brands kept getting crushed while dark ones sailed through, and it left dark-mode fills below APCA's own `non-text` floor of 30.
254
+
255
+ - `accent-surface` → `{ apca: [45, 85] }`. Lc 45 is APCA's `large` tier. The base stays `surface`, so with the `bg` polarity Glaze solves `apcaContrast(surface, fill)` — in light, where `surface` is `oklch(1 0 0)`, that is white-on-fill, the pair every `type="primary"` label rides on.
256
+ - `accent-text-soft` → `{ apca: [60, 85] }` and `accent-text` → `{ apca: [75, 92] }`, APCA's `content` and `body` tiers, one step apart so the rest→hover intensify cannot collapse onto one color.
257
+
258
+ In light this is a real relaxation: the floor drops from ~WCAG 3.0 to ~WCAG 2.3, giving a brand about 8 tone points more headroom before it is darkened. `#0EA5E9` now renders at 2.77 against the page instead of being pushed to 3.0.
259
+
260
+ Two things worth knowing. The high-contrast tier can no longer say "AAA in both schemes": WCAG 7 is Lc 83.5 in light but Lc 54.4 in dark, so no single Lc restates it. `85` is the closest — ~6.1 in light, a shade under AAA, and ~15 in dark. And the tier has to be APCA at all because Glaze rejects a `contrast` pair that switches metric between its normal and high-contrast entries, which is a fair guard rather than something to work around.
261
+
262
+ Anchoring the fill to `accent-surface-text` to make "from white" literal in both schemes was tried and rejected: in dark the label root is near-white while the page is not, so the floor stopped constraining the fill against the page and `#111827` came out at WCAG 1.16 against the dark surface — invisible.
263
+
264
+ The fill carries **two** floors, not one, because in dark they pull opposite ways and dropping either produces the mirror image of the other's failure.
265
+
266
+ Glaze takes one `base` per color, so only the page floor can be expressed as a `contrast`; the label floor is a cap on the seed tone, searched against Glaze's own fixed-mode resolution rather than a reimplementation of the dark tone window. It only ever lowers, so a brand that was already dark enough is emitted unchanged.
267
+
268
+ - **Page floor** (`contrast` against `surface`) — the button has to be a visible shape. Without it `#111827` puts the fill at **Lc 0.0 against the dark page**: a blazing white label on a shape that is not there. The border does not stand in for it, being deliberately low-contrast.
269
+ - **Label floor** (the seed cap) — the `#white` that every `type="primary"` item paints has to be readable. Without it `#FFFFFF` clears the page floor in dark at WCAG 14.4 while the label lands on **Lc 0** — the label is exactly its own fill.
270
+
271
+ In light the page IS white, so the two collapse into the single measurement Glaze already makes and the cap never fires.
272
+
273
+ This also reaches the `special` theme, whose `SPECIAL_PRIMARY_STYLES` paints `#white` on the same brand fill. `#FFD400` is one of the colors the cap moves — white on it untouched is Lc 28 — so the brand's hue carries into the hero button but its tone is capped. The test that asserted the literal survived unchanged now asserts the hue arrived, since exact equality there was a demand that the button's own label be unreadable.
274
+
275
+ - [#1336](https://github.com/cube-js/cube-ui-kit/pull/1336) [`acb9ab59`](https://github.com/cube-js/cube-ui-kit/commit/acb9ab5966499a0b061310b0912de66bac1c1512) Thanks [@tenphi](https://github.com/tenphi)! - Fix a color-seeded accent fill collapsing to one value across the dark tone range.
276
+
277
+ The brand fill answers to two APCA constraints, and they were sized the same. The `#white` label it carries needs Lc 45 — text strength, because it is text. The page it sits on was asked for Lc 45 too, escalating to Lc 60 in high contrast, which is a demand that a filled shape reach text-grade contrast against the background.
278
+
279
+ Nothing in the palette meets that. Measured on the emitted tokens, the **shipped** `accent-surface` — the white-anchored ladder every primary button used before color seeds existed — sits at **Lc 25.5** off the dark page and **Lc 19.3** in dark high contrast, where the ladder darkens the fill toward its label. So a color-seeded fill was being held to 1.8x and 3.1x what the design system's own button achieves.
280
+
281
+ The two look identical in light, which is how it went unnoticed: there `surface` **is** white, so one measurement is both constraints at once and Lc 45 is right for the pair. In dark the page is near-black, and because a floor can only lighten, the surplus flattened the tone axis: every seed below the floor solved to the same fill. Measured across the axis at one hue, the dark fill was pinned at tone 66 for every seed from 5 to 65 — a brand's whole dark half collapsing onto one lavender — while light passed the same seeds through untouched. In dark high contrast the floor met the label cap and left a window of a single value.
282
+
283
+ The page floor is now **Lc 25 in both tiers**, calibrated to the shipped fill rather than to a text threshold. The same sweep now tracks the seed from tone 47 up, and 47 is where the shipped fill sits in dark, so the dark range went from 7.7 tones to ~27 against light's ~45. The pair is written with both entries equal in order to suppress APCA's automatic +15 Lc enhancement in high contrast: that tier is a request for separation over brand, but not for separation from the page — the same fill carries the label, and driving it off the page drives the label off it.
284
+
285
+ The white label is unaffected. It never depended on this number: it is guaranteed by the tone cap on the seed, which searches all four variants against pure white. A lower page floor lightens less, so it makes that guarantee safer rather than weaker.
286
+
287
+ Light mode is unchanged — a dark brand on a white page measures Lc 100+, so this floor never bound there. Palettes with no color seed are untouched: the white-anchored ladder keeps its `['AA','AAA']` floors.
288
+
289
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - Four fixes to the pinned-brand accent path, from review.
290
+
291
+ **An explicit `hue` now rotates the whole accent ramp.** `resolveConfig` ranks a numeric `hue` above the one an `accentColor` carries, but `buildPalette` handed Glaze the original literal — so `accent-surface` kept the color's hue while `-2`, `-3` and `hover` followed the theme's. A primary button changed hue on hover. The seed is now built from the resolved hue, chroma and tone rather than the string, and the regression test asserts on emitted tokens rather than on `getPaletteConfig().hue`, which was already correct while the ramp was split.
292
+
293
+ **The white-label floor now holds on the emitted fill.** The ceiling was computed on the bare seed, but what ships is the fill after the page floor has had its turn — and that floor can only lighten, which is what weakens a white label. A 3072-case sweep over hue, chroma, tone, scheme and tier found 720 failures, the worst putting the label at Lc 20.7. Three things fixed it: the ceiling is now a property of the hue/chroma pair rather than of the tone asked for (it previously only searched when the requested tone already failed, so a dark tone probed first let every later light tone escape), it searches to a measured +3 Lc margin so the page floor cannot eat back through 45, and the high-contrast page floor drops from Lc 85 to 60.
294
+
295
+ That last one is geometry, not preference. The two floors pull opposite ways in dark: the page wants a lighter fill, the label a darker one. The window they share is `L ∈ [0.605, 0.735]`, and asking 85 of the page empties it outright — 60 is the largest value that keeps it open, with 65 reopening 768 failures. High contrast escalates the fill only as far as its own label can follow.
296
+
297
+ **The accent-cap cache is versioned.** It resolves through Glaze's global settings, including the dark tone window, so a caller running `glaze.configure(...)` then `invalidatePaletteTokens()` had changed the answer without changing the seed. Keyed on the palette version now, which is what makes that API mean what it says.
298
+
299
+ **Replacing one unparseable color with another registers.** Both resolve to `null`, and the pin signature recorded only whether the field was present, so `setPaletteConfig({ accentColor: 'bad-two' })` after `'bad-one'` returned early — input kept the first string and no subscriber heard. The signature carries the two color values now.
300
+
301
+ Documentation across the JSDoc, the Theme Builder tooltip, `Theming.docs.mdx` and the earlier changeset no longer promises WCAG 3:1. The floors are APCA Lc 45, and an emitted fill can legitimately sit under 3:1 — `#0EA5E9` renders at 2.77:1 and is correct there.
302
+
303
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - The accent label cap hands Glaze its probe seed as an `OkhstColor` instead of a formatted string.
304
+
305
+ `from` accepts `string | OkhslColor | OkhstColor | RgbColor | OklchColor`, so the seed never needed to become text. Dropping `formatOkhst` removes the writers' scale question from this path entirely — and with it the two decimal places `okhst()` rounds to. `#7A4DBF` round-tripped through a string came back `0.450200` against a true `0.450191`.
306
+
307
+ No Glaze change: `OkhstColor` is existing 2.0.0 API.
308
+
309
+ One test moves with it. The cap's floor is measured on the emitted token, whose `oklch()` string carries four decimals, so `#FFD400` now reads Lc 44.9925 where it used to read a hair over 45 — the string round-trip had been rounding it up. The assertion takes the same epsilon treatment the high-contrast one already had (`84.9` for an 85 target). The shortfall is 0.0075 Lc, three orders of magnitude below anything visible, and the change is in the direction of accuracy.
310
+
311
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - `ColorInput` and `ColorPicker` keep the `20px` swatch they have always drawn.
312
+
313
+ Giving `ColorSwatch` a size of its own changed both of them by accident. `ColorInput` passed the field's size straight through, so a `medium` field's swatch went `20px → 24px` and a `large` one `20px → 28px`; the `ColorPicker` trigger was left to track its button and moved `20px → 24px` the same way. Measured in a real browser against `main`, at every field size.
314
+
315
+ Neither was a size anyone asked for. The swatch in a color field reads as a value the field is showing, not as part of the control, so it is now pinned at `20px` in both — identical to `main` at `small`, `medium` and `large`.
316
+
317
+ The `size` prop and the automatic fitting are unchanged and remain the right thing for a swatch you place yourself in a `Button` or an `Item`, where the host has the padding that makes it work. A text input hangs its prefix off the border with none of its own, which is why the fields opt out.
318
+
319
+ Also corrects the docs, which gave the automatic fit in a `large` control as `32px` where it is `28px`.
320
+
321
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - A manual `contrastLevel` no longer suppresses the high-contrast tier (via `@tenphi/glaze` 1.5.0).
322
+
323
+ The level now does one thing: it positions the **normal** colors on the 0–100 slider. The high-contrast tier stays the true high-contrast resolution — identical to what `contrastLevel: 'auto'` emits — at every level, so the two **compose** rather than replace each other: a product's own contrast slider raises the baseline while `<html data-contrast="high">` / `prefers-contrast: more` still escalates on top of it.
324
+
325
+ Two consequences for anyone who had set a level:
326
+
327
+ - `contrastLevel: 0` now reproduces `'auto'` output exactly, high-contrast tier included. Shipping the slider and defaulting it off therefore costs nothing — previously it silently dropped the tier, so `data-contrast="high"` stopped working the moment a level was set.
328
+ - At `contrastLevel: 100` the normal colors already _are_ the high-contrast ones, so a separate tier would only duplicate them: a single light/dark set is emitted. That is now the only level at which the tier is absent.
329
+
330
+ `renderColorTokens()` / `renderPaletteTokens()` follow the same rule — `highContrast: true` returns the genuine escalated variant at any level below 100.
331
+
332
+ The shipped palette is unaffected: it runs at `contrastLevel: 'auto'`, and the default-palette snapshot is unchanged.
333
+
334
+ - [#1332](https://github.com/cube-js/cube-ui-kit/pull/1332) [`ac2ec331`](https://github.com/cube-js/cube-ui-kit/commit/ac2ec331a5d5b5d6b7af4849b0870b41f6637324) Thanks [@tenphi](https://github.com/tenphi)! - Fix the `current` theme fading a disabled label twice.
335
+
336
+ `current.item` and `current.clear` already suppressed their own `.4` label fade when the disabled state was inherited from a host that had faded `currentcolor` already, but `current.outline`, `current.outline-2`, `current.primary` and `current.link` stated it as a bare `disabled`. Two of those — `outline` and `primary` — are reachable `Item.Action` types, so an action inside a disabled row (including `Banner`'s outline actions) multiplied the two fades and rendered at `.16` of the row's color, washing out both the label and the alpha chip.
337
+
338
+ Every `current` flavour now gates the fade on `disabled & !inherit-disabled & !inside-wrapper`. The second mod closes the other half of the same hole: `ItemButton` renders its actions as siblings of the row inside a wrapper, and the wrapper reproduces the row's disabled color so those siblings inherit a faded `currentcolor`. It previously could not, because the gated key was skipped when deriving the wrapper's colors — so a disabled `ItemButton` on the `current` theme sat next to full-strength actions. The wrapper now reads the gated value, and the row suppresses its own fade under `inside-wrapper`, leaving exactly one `.4` on every path.
339
+
340
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - `@tenphi/glaze` 2.0.0, whose one breaking change is the `format*` scale fix ([tenphi/glaze#93](https://github.com/tenphi/glaze/issues/93), [#94](https://github.com/tenphi/glaze/pull/94)).
341
+
342
+ `formatOkhsl` / `formatOkhst` / `formatRgb` / `formatHsl` / `formatOklch` took `s` / `l` / `t` as 0–100 percentages while every producer — `resolve()`, `variantToOkhsl`, `srgbToOkhsl`, `oklabToOkhsl`, `okhslToSrgb` — returns them on 0–1. Composing the two was off by 100× and failed silently, since `0.7` is a legal percentage and the result was a valid CSS string naming a near-black color. Glaze now speaks one scale end to end, and a leftover `* 100` warns instead of shifting the color quietly.
343
+
344
+ Every affected call site drops its scaling: `formatColor` in the color field (five notations, whose tests assert exact strings like `okhst(29.23 100% 58.59%)`) and the accent label cap in the palette. Output is unchanged — the palette's four-variant token values are byte-identical before and after, and Glaze's own export methods were compensating internally.
345
+
346
+ The tone axis is the exception the release notes call out: `toTone` / `fromTone` still speak the authoring API's 0–100, so a tone is divided by 100 on its way into `formatOkhst` while a saturation read off `resolve()` is passed straight through.
347
+
348
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - `HueSlider` prints its value in degrees.
349
+
350
+ A hue is an angle, and the slider already renders its value beside the label — so a caller who wanted the unit had to put it in the label instead, which then repeated the number the slider was showing anyway. It now defaults `formatOptions` to `{ style: 'unit', unit: 'degree', unitDisplay: 'narrow' }`, giving `280°`. Pass your own `formatOptions` to override it.
351
+
352
+ - [#1314](https://github.com/cube-js/cube-ui-kit/pull/1314) [`781973c9`](https://github.com/cube-js/cube-ui-kit/commit/781973c99eaf5c4598d77bfccefbc4f7db52674c) Thanks [@tenphi](https://github.com/tenphi)! - `RadioGroup` is `border-box`, so an explicit width means the box you can see.
353
+
354
+ The `tabs` layout is the one with padding of its own, and it was laid out as `content-box`: `<Radio.Tabs styles={{ width: '100%' }} />` came out `1x` wider than its container and overhung the right edge. The color popover's space switcher (HST / LCH / RGB) was the visible case — it touched the popover border while everything above and below it sat inside the padding.
355
+
356
+ Groups without an explicit width are unaffected: they size to `max-content`, which measures the same either way.
357
+
358
+ - [#1332](https://github.com/cube-js/cube-ui-kit/pull/1332) [`ac2ec331`](https://github.com/cube-js/cube-ui-kit/commit/ac2ec331a5d5b5d6b7af4849b0870b41f6637324) Thanks [@tenphi](https://github.com/tenphi)! - Fix the `selected & disabled` state on the `outline`, `outline-2` and `clear` types across the `default`, `danger`, `success`, `warning` and `note` themes: it was heavier than the enabled state it is supposed to mute.
359
+
360
+ The state borrowed `accent-disabled-surface` / `accent-disabled-surface-text` — the pair built for a PRIMARY button, whose enabled state is already an opaque brand fill under a `#white` label, so a mid-tone chip is a step _down_ there. On a non-solid type it is a step _up_: against a 9% brand tint under soft accent text, the `-13` chip read as a filled pill, and its `tone: 'max'` label resolved to literal white in light mode. A disabled segmented control therefore drew more attention than a live one, and the selected option looked like the only enabled one.
361
+
362
+ It now keeps the enabled selected chip and fades only the label. The chip is the thing that says "this one is on", so it does not change weight at all when the control goes disabled; the label drops to a new `accent-disabled-text` token — the neutral `disabled-surface-text` geometry (the same `-23` tone delta against `surface`, adaptive, so it reads exactly as disabled as every other disabled label in light, dark and high contrast) carrying brand chroma instead of neutral, at roughly 2× `disabled-surface-text` and comfortably under `accent-text-soft`. Selection survives as a hue on a label of unchanged paleness, which is what CUB-3912 asked for: a disabled segmented control still shows which option is active.
363
+
364
+ The chip's tint tracks whatever token that theme's `selected` state uses — `accent-surface` for the outline types and for `default.clear`, `accent-text` for the four status themes' `clear`, which do not share `default`'s token. It is written as `.08` rather than reusing `selected`'s own `.09`, and the difference is deliberately imperceptible. The two entries must not serialize to the same string: Tasty's `mergeEntriesByValue` pass coalesces equal values into one OR-entry at the group's max priority, so a literal reuse would merge `selected` into `selected & disabled` and then negate against `selected & (hovered | focused)` — the "selected-hover stays dark" bug that `SPECIAL_CLEAR_STYLES` documents and escapes the same way.
365
+
366
+ No existing token changed value — the palette addition is `accent-disabled-text` and nothing else. `primary` keeps `accent-disabled-surface`, which is correct for a solid fill; the `special` and `current` themes keep their own white-alpha and `currentcolor` registers.
367
+
368
+ A unit test pins both halves of the invariant across all fifteen brand-theme x non-solid-type variants: the disabled selected fill must equal the enabled one modulo that alpha, and the label must be the `accent-disabled-text` of its theme.
369
+
370
+ The `special` theme gets the same treatment, plus a correction its non-selected disabled state needed on its own. Every disabled label there sat far above the house figure for a dead control: measured against the chip it sits on, `outline` disabled came out at cr 3.24 and `outline` selected + disabled at 4.21 — not only too legible, but the wrong way round, since the selected one out-read the plain one. For scale, `disabled-surface-text` measures ~2.02 against `surface` and this theme's own `primary` disabled pair measures 1.73. The white-alpha labels are now solved for cr ~2.0 against whatever each one sits on: `#white.23` for the plain disabled states across `outline`, `clear`, `item` and `link`, `#white.28` for `outline` selected + disabled on its `.17` chip. `outline` selected + disabled keeps the enabled selected chip like the colored themes (`.17` against its `.18`), and `clear` — whose selected state flips to a solid white pill — keeps that pill and fades its DARK label instead, to `#special-accent-text.45`, cr 1.95 against the pill.
371
+
372
+ The `current` theme's `clear` flavour gains the same state, which it was missing entirely: a disabled selected `clear` fell through to the item ramp's bare `transparent` and rendered no chip at all, so it was indistinguishable from an unselected one. It now carries `#current.18` — `current.outline`'s own disabled selected chip, so the two differ by exactly the border. This is the same split the colored themes already make between `*_ITEM_STYLES` and `*_CLEAR_STYLES`.
373
+
374
+ - [#1328](https://github.com/cube-js/cube-ui-kit/pull/1328) [`cfa6fb6e`](https://github.com/cube-js/cube-ui-kit/commit/cfa6fb6edb665959ad206829a2fa34ffefc7b97c) Thanks [@tenphi](https://github.com/tenphi)! - Update `@tenphi/tasty` to `3.0.2`. A patch release with no public API change — the export surface is byte-for-byte the same set of names as `3.0.1` — so nothing in the UI Kit needed migrating and the full suite passes unchanged.
375
+
376
+ Two clarifications in Tasty's docs are worth knowing if you write custom tokens: token names are case-sensitive and should start lowercase (a leading capital folds, so `$Foo` resolves to `--foo`), and `preset` / `transition` take token _names_ rather than values, so a bare `$name` there warns in dev and is ignored. Neither affects this package — no capitalized token name is used anywhere in `src`.
377
+
378
+ The tree-shaking size budget goes from 123 kB to 124 kB. Tasty's core grew ~0.56 kB in this release, which put the old budget 31 bytes over; the `All` entry moved by the same amount and stays inside its 501 kB budget.
379
+
380
+ ## 0.163.0
381
+
382
+ ### Minor Changes
383
+
384
+ - [#1323](https://github.com/cube-js/cube-ui-kit/pull/1323) [`82616524`](https://github.com/cube-js/cube-ui-kit/commit/826165244c923627a036a66af386f5a8478986bb) Thanks [@tenphi](https://github.com/tenphi)! - `Radio` / `Radio.Button`: a button- or tabs-type radio now accepts the full content API of the `Item` it renders, matching `ItemButton`. Newly forwarded: `descriptionPlacement`, `descriptionProps`, `keyboardShortcutProps`, `isLoading`, `loadingSlot`, `highlight`, `highlightCaseSensitive`, `highlightStyles`, `level` and `labelRef`. `description` now has a grid area to land in, so it renders in both `inline` and `block` placement, and container style props (`padding`, `gap`, `fill`, `preset`, …) apply to button-type radios instead of being dropped. A loading button radio is also disabled, so it no longer takes clicks or arrow-key selection — pass an explicit `isDisabled={false}` to opt out.
385
+
386
+ - [#1319](https://github.com/cube-js/cube-ui-kit/pull/1319) [`2a8d0b4a`](https://github.com/cube-js/cube-ui-kit/commit/2a8d0b4ad6e05b913a7aa6ca0eade56ff5e151ff) Thanks [@tenphi](https://github.com/tenphi)! - Lint ui-kit's own source with the `no-redundant-default-prop` rule it ships, and fix four registry entries that autofixing would have broken.
387
+
388
+ The plugin was never applied to this repo. Two things prevented it, and the second was silent: nothing loaded the plugin, and provenance is gated on the import specifier literally matching `@cube-dev/ui-kit`, which no file in `src/` uses — every component import here is relative, across 210 distinct specifiers that share no usable prefix. So even once loaded, the rule reported nothing.
389
+
390
+ - New `relativeImports` rule option, which also accepts relative specifiers as ui-kit provenance. It exists for linting this repository and must not be enabled in a consumer project, where a relative import is the consumer's own component. Shadowing still bails either way — resolution requires an `ImportBinding`, so a local `const Badge = tasty({})` is never matched.
391
+ - `configs.recommended` now sets stories and `.docs.mdx` to `warn` instead of `off`. Stories are the code people copy, so redundant props there travel outward and are worth surfacing; a deliberate side-by-side contrast still has a real reason to name a default, so it warns rather than failing a build.
392
+
393
+ Four props were classified as plain defaults when they are actually inherited overrides, so the rule would have offered — and `--fix` would have taken — an autofix that changed behaviour. Each is now `skip: 'context'`:
394
+
395
+ - `ItemAction` `isDisabled` and `type`. `<Item isDisabled>` renders its `actions` inside `ItemActionProvider`, and `isDisabled = isDisabledProp ?? contextIsDisabled`, so `<ItemAction isDisabled={false}>` is the documented way to keep one action live inside a disabled item. Stripping it silently disabled that action.
396
+ - `ItemBadge` `type` and `theme`, which read the same context and had no conditions on their fixture at all.
397
+ - `Dialog` `isDismissable`, resolved as `contextProps.isDismissable` with no literal fallback while `DialogContainer` and `DialogTrigger` default that context value to `true`, so a nested `<Dialog isDismissable={false}>` is an override. Three call sites in shipped source relied on it.
398
+
399
+ The cause is general: a prop resolved as `prop ?? context ?? literal` probes as a plain default in a bare tree, because the literal wins when nothing supplies the context. Only `ItemAction`'s `theme` was classified correctly, and only because it happened to be the one prop with a matching condition. The fixtures now supply a differing value for each such prop, so the prover derives these skips itself and the sync guard re-proves them on every test run rather than trusting a hand-written note. A repo-wide audit for the pattern found no other affected component.
400
+
401
+ ### Patch Changes
402
+
403
+ - [#1323](https://github.com/cube-js/cube-ui-kit/pull/1323) [`82616524`](https://github.com/cube-js/cube-ui-kit/commit/826165244c923627a036a66af386f5a8478986bb) Thanks [@tenphi](https://github.com/tenphi)! - `Item` themes: a disabled item now keeps showing whether it is selected. The `disabled` entry in every `outline`, `outline-2` and `clear` variant used to override `selected` outright, so a disabled segmented control — `RadioGroup type="button"` most visibly — rendered every option identically with no sign of which one was active. Each of those variants gains a `selected & disabled` state that paints the brand-tinted `accent-disabled-surface` chip and its paired label instead of the neutral one, across all six themes (`special` and `current` stay in their own white-alpha / `currentcolor` registers). `type="item"` rows are unchanged — they already keep brand identity in their disabled label and pair selection with a checkmark.
404
+
405
+ - [#1322](https://github.com/cube-js/cube-ui-kit/pull/1322) [`b56c0073`](https://github.com/cube-js/cube-ui-kit/commit/b56c0073e6eeb622f458cb017cf8c202c9e638d9) Thanks [@tenphi](https://github.com/tenphi)! - Make `no-redundant-default-prop` fire on compound aliases such as `<Radio.Group>`, which it silently ignored.
406
+
407
+ The registry is keyed on the name each render fixture carries — the flat `RadioGroup` — while the rule resolves a JSX tag to its dotted path, `Radio.Group`. The lookup missed, so the entry only ever fired on the form nobody writes: every example in `RadioGroup.docs.mdx` uses `<Radio.Group>` / `<Radio.Tabs>`, and two genuinely redundant props in `RadioGroup.stories.tsx` went unreported. `Button.Split`, `Item.Action`, `Menu.Trigger` and `Input` had the same gap.
408
+
409
+ `DefaultsRegistry` now carries an `aliases` map from alias path to canonical key, generated by walking the package exports and recording every path whose value **is the same object** as a covered component. Fixtures still name one export each; the 27 alias paths are derived, so adding a fixture needs no alias bookkeeping.
410
+
411
+ Identity, not name shape, is what makes this safe. `Radio.Group` is `RadioGroup` itself and cannot behave differently, but `Radio.ButtonGroup` is `tasty(RadioGroup, { type: 'button' })` and `Radio.Tabs` is `tasty(RadioGroup, { type: 'tabs' })` — different objects with a different effective `type` default. A rule that normalised the dotted path by concatenating it would hand those two RadioGroup's entry and offer to strip a `type` that is not their default; identity skips them. Each alias is re-checked against the live exports on every test run, so a refactor that turns an alias into a wrapper fails instead of shipping a wrong entry.
412
+
413
+ This is a missed-cleanup fix, not a correctness one — the rule was silent, never wrong. Unrelated to `VerifiedDefault.aliases`, which lists alternate spellings of a prop _value_ and stays hand-curated.
414
+
415
+ - [#1319](https://github.com/cube-js/cube-ui-kit/pull/1319) [`2a8d0b4a`](https://github.com/cube-js/cube-ui-kit/commit/2a8d0b4ad6e05b913a7aa6ca0eade56ff5e151ff) Thanks [@tenphi](https://github.com/tenphi)! - Fix `RadioGroup`'s documented `size` default, which was wrong in a way the lint rule acted on.
416
+
417
+ `RadioGroup.docs.mdx` contradicted both itself and the implementation: the `## Properties` bullet said `(default: xsmall)` while its own prose said `medium`, and `Radio.tsx` resolves `size ?? contextSize ?? 'medium'`. The default is `medium`.
418
+
419
+ That annotation is what seeds the `no-redundant-default-prop` registry, so the shipped rule claimed `<RadioGroup size="xsmall">` was redundant and offered to delete it — which silently resized the radios to `medium`. The prover could not catch the drift because `size` only reaches the DOM through the radios and a plain `type="radio"` radio renders identically at every size, so any documented value verified. The fixture now probes under `type="button"` and `type="tabs"` as well, which is what makes a wrong `size` value fail: restoring `xsmall` under the new conditions correctly downgrades the prop to `skip: 'conditional'` instead of passing as a verified default.
420
+
421
+ Also corrects the tabs-mode size mapping table. It claimed `xlarge` maps to `large` and listed `xsmall` as passing through, but `Radio.tsx` maps only `large`, funnelling every other size through `RADIO_SIZE_MAP.medium` — so `xsmall`, `small`, `medium` and `xlarge` all collapse to `xsmall`.
422
+
3
423
  ## 0.162.0
4
424
 
5
425
  ### Minor Changes
package/dist/README.md CHANGED
@@ -129,7 +129,7 @@ const StatusBadge = tasty({
129
129
 
130
130
  ### Prerequisites
131
131
 
132
- - Node.js >= 22.0.0
132
+ - Node.js 24 (see `.nvmrc`)
133
133
  - pnpm >= 10
134
134
 
135
135
  ### Scripts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useEvent } from "./use-event.js";
3
3
 
4
4
  //#region src/_internal/hooks/use-chained-callback.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useEffect, useRef, useState } from "react";
3
3
 
4
4
  //#region src/_internal/hooks/use-debounced-value.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { deprecationWarning } from "../../utils/warnings.js";
3
3
  import React, { useEffect } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useSyncRef } from "./use-sync-ref.js";
3
3
  import { useCallback } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useRef } from "react";
3
3
 
4
4
  //#region src/_internal/hooks/use-is-first-render.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useLayoutEffect as useLayoutEffect$1 } from "../../utils/react/useLayoutEffect.js";
3
3
  import { useRef } from "react";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  //#region src/_internal/hooks/use-timer/timer.ts
3
3
  var Timer = class {
4
4
  callback;
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useEvent } from "../use-event.js";
3
3
  import { Timer } from "./timer.js";
4
4
  import { useEffect, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { useEvent } from "./use-event.js";
3
3
  import { warn } from "../../utils/warnings.js";
4
4
  import { useRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { ItemAction } from "./actions/ItemAction/ItemAction.js";
3
3
  import { ItemBadge } from "./content/ItemBadge/ItemBadge.js";
4
4
  import { Item } from "react-stately";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.162.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
2
2
  import { usePaletteVersion } from "../tokens/palette-config.js";
3
3
  import { getTokens } from "../tokens/index.js";
4
4
  import { useGlobalStyles, useRawCSS } from "@tenphi/tasty";