@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/docs/Theming.md CHANGED
@@ -1,16 +1,25 @@
1
1
  # Theming
2
2
 
3
- The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a
4
- handful of seeds: an accent hue, a base hue, a saturation, and a hue per status
5
- theme. Those seeds are tunable at runtime — change one and every token re-resolves, in light,
3
+ The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a handful
4
+ of seeds, one per **zone**: the accent, the base, and each of the four status themes.
5
+ Those seeds are tunable at runtime — change one and every token re-resolves, in light,
6
6
  dark, and high-contrast schemes at once.
7
7
 
8
+ Every zone takes the same seed, and it comes in two forms: a **color**, which is usually
9
+ what you actually have, or the **numbers** behind one. Never both — a zone is seeded one
10
+ way or the other. See [One seed, two ways to spell it](#one-seed-two-ways-to-spell-it).
11
+
8
12
  ```ts
9
13
  import { setPaletteConfig } from '@cube-dev/ui-kit';
10
14
 
11
15
  setPaletteConfig({
12
- hue: 210,
13
- saturation: 72,
16
+ accent: '#2F5BFF',
17
+ themes: { danger: '#b91c1c' },
18
+ });
19
+
20
+ // The same shape, said in numbers.
21
+ setPaletteConfig({
22
+ accent: { hue: 210, saturation: 72 },
14
23
  themes: { danger: { hue: 12 } },
15
24
  });
16
25
  ```
@@ -21,16 +30,22 @@ value so this stays true.
21
30
 
22
31
  ## What is tunable
23
32
 
24
- | Option | Scope | Default |
25
- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
26
- | `hue` | **Accent** hue in degrees — the brand. Drives the `accent-*` family, `primary` / `purple` / `special`, and the brand-tinted `focus`, loading faces and disabled chip. | `280.3` |
27
- | `baseHue` | **Base** hue in degrees — the neutral chrome: `surface` and its ladder, the `surface-text*` ramp, `border`, `placeholder`. | inherits `hue` |
28
- | `saturation` | Seed saturation (0–100) for the `default` theme, and the fallback for every theme that sets none. | `100` |
29
- | `themes.<status>.hue` | Hue for `success` / `danger` / `warning` / `note`. | `156.9` / `23.1` / `84.3` / `302.3` |
30
- | `themes.<status>.saturation` | Saturation for that status theme. | inherits `saturation` |
31
- | `themes.code.saturation` | Saturation for the `code-*` syntax family. Hues are fixed, and this does **not** inherit `saturation`, nor track its default. | `80` |
32
- | `pastel` | Global. Relaxes the sRGB-safe chroma limit. Every theme except `code`. | `true` |
33
- | `contrastLevel` | Global. `'auto'`, or a manual `0`–`100` level. | `'auto'` |
33
+ Every zone below takes a `PaletteSeed`: either a color string, or `{ hue?, saturation? }`.
34
+
35
+ | Option | Scope | Default |
36
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
37
+ | `accent` | The **accent** zone the brand. Drives the `accent-*` family on every theme, `primary` / `purple` / `special`, and the brand-tinted `focus`, loading faces and disabled chip. | `{ hue: 280.3 }` |
38
+ | `accent` as a color | Contributes hue, chroma **and tone**, so the brand fill renders as the color you passed. Its chroma reaches the accent family through Glaze's `from`, not through the zone's seed. | unset |
39
+ | `accent.saturation` | Seed saturation (0–100) for the `default` theme, and the fallback every status theme inherits. Setting it **turns `pastel` off**, which is the path it belongs to. | `100` |
40
+ | `base` | The **base** zone — the neutral chrome: `surface` and its ladder, the `surface-text*` ramp, `border`, `placeholder`. Omit it and the zone follows the accent. | follows `accent` |
41
+ | `base` as a color | Contributes hue **and saturation**, clipped to 50; its tone is discarded. | unset |
42
+ | `base.saturation` | Seed saturation (0–100) of the base zone, on the same scale as the accent's. The shipped chrome is `12`. | `(accent's chroma) × 0.12` |
43
+ | `themes.<status>` | Seed for `success` / `danger` / `warning` / `note`. | `156.9` / `23.1` / `84.3` / `302.3` |
44
+ | `themes.<status>` as a color | All three components, and its chroma **does** become the theme's seed — unlike the accent's. See [Status themes](#status-themes). | unset |
45
+ | `themes.code.saturation` | Saturation for the `code-*` syntax family. Hues are fixed, it takes no color, and it does **not** inherit the accent's saturation nor track its default. | `80` |
46
+ | `surfaceMode` | Global. `'tinted'` moves the neutral surface ramp two tones off the end of the tone scale, which is what gives the base saturation room to reach the page surface. | `'neutral'` |
47
+ | `pastel` | Global. Relaxes the sRGB-safe chroma limit, and **pins the accent's saturation to 100**. Wins wherever both are set. Every theme except `code`. | `true` |
48
+ | `contrastLevel` | Global. `'auto'`, or a manual `0`–`100` level. | `'auto'` |
34
49
 
35
50
  ### The setter replaces
36
51
 
@@ -39,8 +54,8 @@ config you pass **is** the config, resolved against the shipped defaults. Nothin
39
54
  accumulates, so removing a customization means removing it from the object:
40
55
 
41
56
  ```ts
42
- setPaletteConfig({ hue: 200, baseHue: 60 });
43
- setPaletteConfig({ hue: 200 }); // baseHue is gone — back to inheriting `hue`
57
+ setPaletteConfig({ accent: { hue: 200 }, base: { hue: 60 } });
58
+ setPaletteConfig({ accent: { hue: 200 } }); // `base` is gone — follows accent again
44
59
  ```
45
60
 
46
61
  That is what makes the config safe to keep in your own state and re-apply: the
@@ -52,9 +67,14 @@ pass an updater. It receives the config **as written**, sparse, so spreading it
52
67
  preserves which fields are pinned and which still inherit:
53
68
 
54
69
  ```ts
55
- setPaletteConfig((config) => ({ ...config, saturation: 55 }));
70
+ // A zone holds ONE seed, so a one-field control spreads that seed too — writing a bare
71
+ // `{ hue }` would unpin the saturation beside it.
72
+ setPaletteConfig((config) => ({
73
+ ...config,
74
+ accent: { ...config.accent, saturation: 55 },
75
+ }));
56
76
 
57
- // Nested seeds need their own spread, or the other themes go with them.
77
+ // Nested seeds need their own spread as well, or the other themes go with them.
58
78
  setPaletteConfig((config) => ({
59
79
  ...config,
60
80
  themes: { ...config.themes, warning: { saturation: 95 } },
@@ -64,36 +84,233 @@ setPaletteConfig((config) => ({
64
84
  `resetPaletteConfig()` drops all tuning at once — the same as
65
85
  `setPaletteConfig({})`, just easier to read at a call site.
66
86
 
67
- ### Two hue zones
87
+ ### One seed, two ways to spell it
88
+
89
+ Every zone takes the same `PaletteSeed`, and it comes in two forms:
90
+
91
+ ```ts
92
+ type PaletteSeed = string | { hue?: number; saturation?: number };
93
+ ```
94
+
95
+ A string is a color — anything Glaze parses: hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`,
96
+ `oklch()`. CSS color keywords (`rebeccapurple`) are not supported; an unparseable value
97
+ warns once and falls back to the numeric path.
98
+
99
+ **The union is the exclusivity.** A zone is seeded one way or the other — there is no
100
+ precedence rule to learn, and no way to write a hue that half-overrides a hex. A patch
101
+ that switches form therefore *replaces* rather than merges; layering happens within a
102
+ path:
103
+
104
+ ```ts
105
+ setPaletteConfig({ accent: '#2F5BFF' });
106
+ // A number arriving next to that takes the zone over, tone and all.
107
+ setPaletteConfig((config) => ({ ...config, accent: { hue: 300 } }));
108
+ ```
109
+
110
+ #### The zones
111
+
112
+ - **Accent** (`accent`) — the `accent-*` family on every theme, `primary` / `purple` /
113
+ `special`, plus `focus`, the loading faces and the disabled chip. Its saturation is
114
+ also the fallback every status theme inherits.
115
+ - **Base** (`base`) — the neutral chrome: `surface` and its ladder, the `surface-text*`
116
+ ramp, `border`, `placeholder`.
117
+ - **Status** (`themes.success` / `danger` / `warning` / `note`) — one seed each. See
118
+ [Status themes](#status-themes).
119
+ - **Syntax** (`themes.code`) — the exception: a saturation and nothing else. See
120
+ [The `code-*` family is the exception](#the-code--family-is-the-exception).
121
+
122
+ Omit `base` and the chrome follows the accent, so out of the box the greys carry a faint
123
+ tint of the brand. Seed it to decouple them — a warm grey UI under a cool blue brand:
68
124
 
69
- Hue is split into an **accent** zone and a **base** zone:
125
+ ```ts
126
+ setPaletteConfig({ accent: { hue: 235 }, base: { hue: 60 } });
127
+ ```
70
128
 
71
- - **Accent** (`hue`) the `accent-*` family on every theme, `primary` / `purple` /
72
- `special`, plus `focus`, the loading faces and the disabled chip.
73
- - **Base** (`baseHue`) — the neutral chrome: `surface` and its ladder, the
74
- `surface-text*` ramp, `border`, `placeholder`.
129
+ Only the `default` theme is affected. A colored theme's tinted `surface` deliberately
130
+ follows _its own_ hue, because a danger banner should read as red.
75
131
 
76
- `baseHue` inherits `hue`, so out of the box the chrome carries a faint tint of the
77
- brand. Set it to decouple them — a warm grey UI under a cool blue brand:
132
+ #### What a color contributes, per zone
133
+
134
+ The same string means slightly different things by zone, and the differences are the
135
+ point:
78
136
 
79
137
  ```ts
80
- setPaletteConfig({ hue: 235, baseHue: 60 });
138
+ setPaletteConfig({ accent: '#2F5BFF', base: '#7A7269' });
81
139
  ```
82
140
 
83
- Only the `default` theme is affected. A colored theme's tinted `surface`
84
- deliberately follows _its own_ hue, because a danger banner should read as red.
141
+ - **Accent** hue, chroma **and tone**. The tone is what makes the brand fill actually
142
+ _be_ your color. Without it the fill is authored as a fixed tone step off white, so
143
+ every accent hue lands at roughly the same lightness — a yellow brand comes out olive.
144
+ The chroma reaches the accent family through Glaze's `from` rather than through the
145
+ zone's seed, which is what stops a brand from re-chromatising the chrome and all four
146
+ status themes.
147
+ - **Base** — hue and saturation; the **tone is discarded**, because the chrome's own
148
+ lightness ladder is the design. A base color says which way the greys lean and how far,
149
+ not how dark they are.
150
+ - **Status** — hue, chroma and tone, and its chroma **does** become that theme's seed.
151
+ Nothing inherits from a status theme, so there is nothing to re-chromatise, and moving
152
+ the seed is what keeps the banner in proportion to the button.
153
+
154
+ The base color's saturation is **clipped to 50**. Naming a base color says "the chrome
155
+ _is_ this color", so it lands near it rather than at the 12% share it would otherwise
156
+ inherit — but a fully saturated chrome stops being chrome, and the base colors begin to
157
+ converge above 25 anyway (see [Tinted surfaces](#tinted-surfaces)). The tuner's manual
158
+ slider shares the same ceiling, so the two routes agree on what the top of the range
159
+ means. A base **number** is not clipped: a number is the more specific instruction.
160
+
161
+ ```ts
162
+ setPaletteConfig({ base: '#6e7076' }); // near-grey in, near-grey chrome out
163
+ setPaletteConfig({ base: '#FFD400' }); // saturation 100 in, clipped to 50
164
+ setPaletteConfig({ base: { saturation: 100 }, pastel: false }); // 100 stays 100
165
+ ```
166
+
167
+ ### A color seed is a request
168
+
169
+ The palette renders the color you asked for, and moves it only as far as it has to. Two
170
+ things can make it move.
171
+
172
+ First, **exactness is scoped to the light, normal-contrast variant.** That is the one
173
+ that reproduces your color. Dark and high contrast adapt, as every other color in the
174
+ palette does — they are different pages, and a brand pinned across all four would be
175
+ less faithful, not more. What holds everywhere is the floor below.
176
+
177
+ **The fill answers to two constraints, and they are different sizes.** The `#white`
178
+ label it carries needs **APCA Lc 45** — text strength, because it is text. The page it
179
+ sits on needs only **Lc 25**, because a solid fill is a shape, not text, and Lc 25 is
180
+ what the palette's own shipped fill achieves against a dark page. Both are floors rather
181
+ than targets: a brand already past them is emitted exactly as given, and one that misses
182
+ moves only as far as the nearer requires.
183
+
184
+ Sizing those two the same is a mistake worth naming, because this palette made it. In
185
+ light `surface` **is** white, so one measurement is both constraints at once and Lc 45
186
+ looks right for the pair. In dark the page is near-black and the same number becomes a
187
+ demand that a filled shape reach text contrast against it — which nothing in the palette
188
+ meets, the shipped fill included. Since a floor can only lighten, the surplus flattened
189
+ the dark half of the tone axis onto a single value: every brand darker than the floor came
190
+ out the same colour. The page floor is now sized for a shape and the label is guaranteed
191
+ separately, by a cap on the seed's tone.
192
+
193
+ They are APCA rather than WCAG on purpose. A single WCAG ratio means two different
194
+ things depending on the scheme: measured across twelve hues, a fill sitting exactly at
195
+ 3:1 comes out at Lc 56 in light but only Lc 23 in dark. That is why light brands kept
196
+ getting crushed while dark ones sailed through the same rule. **A consequence to state
197
+ plainly: the emitted fill can sit below WCAG 3:1.** `#0EA5E9` renders at 2.77:1 against
198
+ a white page and is correct there — the Lc is the guarantee, not the ratio.
199
+
200
+ High contrast does **not** escalate the page floor. It is a request for separation over
201
+ brand, but not for separation from the page: the same fill carries the label, and driving
202
+ it off the page drives the label off it. The shipped ladder makes the same trade and lands
203
+ the other side of it, ending up with *less* page separation in high contrast than in
204
+ normal, because it darkens the fill toward its label. What does escalate is the label cap,
205
+ which searches the high-contrast variants too.
206
+
207
+ **`pastel` caps chroma.** The flat, hue-independent ceiling is what makes pastel even
208
+ across hues, and it sits below where a saturated color would land, so under it a color
209
+ seed can never resolve to itself: `#EF4444` renders `#c47069`. Under pastel the color
210
+ contributes its hue and its tone; turn pastel off to get its chroma too.
211
+
212
+ All of it applies per zone. A status color answers to the same two constraints on its own
213
+ `#<theme>-accent-surface`, including the label cap — every `type="primary"` item on a
214
+ status theme paints `#white` on that fill too, so a pale `danger` color is pulled down
215
+ rather than shipped as a white label on white.
216
+
217
+ Read the result back from the tokens themselves — `#accent-surface` is the fill,
218
+ `#accent-text-soft` the rest link color — or watch the requested/resolved chips in the
219
+ [Theme builder](#theme-builder).
85
220
 
86
221
  ### One saturation scale per theme
87
222
 
88
- Saturation is _not_ split, deliberately: `saturation` is the theme's **seed**, and
89
- every color's own `saturation` is a 0–1 factor of it. `surface` sits at `0.12`,
90
- `border` at `0.175`, the text ramp at `0.2`, the accent family at ~`1.0`.
223
+ Saturation is _not_ split per token, deliberately: a zone's `saturation` is its theme's
224
+ **seed**, and every color's own `saturation` is a 0–1 factor of it. `surface` sits at
225
+ `0.12`, `border` at `0.175`, the text ramp at `0.2`, the accent family at ~`1.0`.
226
+
227
+ So a theme has one saturation _scale_, and everything on it keeps its proportions:
228
+ turning the seed down mutes the brand fills and the neutral tint together, in the ratios
229
+ the palette was designed around. That is the point — the relationship between a subtle
230
+ surface tint and a saturated accent is part of the design, not something to tune per
231
+ token. It is also why a status **color** takes over its theme's seed rather than reaching
232
+ only its fill: chroma arriving absolutely through `from` while the seed stayed put is
233
+ exactly how those ratios come apart.
234
+
235
+ The one seam is the **base zone**, and it is the same seam its own hue opens: the chrome
236
+ is the one family whose job is _not_ to look like the brand. `base.saturation` gives it
237
+ its own seed, on the same 0–100 scale, so a vivid accent over near-grey chrome — or a
238
+ muted accent over visibly warm chrome — is one number rather than a choice between them:
239
+
240
+ ```ts
241
+ setPaletteConfig({ accent: { saturation: 90 }, base: { saturation: 3 } });
242
+ ```
243
+
244
+ Unset, it takes `0.12` — `surface`'s own factor — of whatever the accent zone carries:
245
+ its seed saturation, or an accent color's own chroma when one is set. So leaving it alone
246
+ reproduces the shipped palette exactly, a muted accent still mutes the chrome along with
247
+ everything else, and a near-grey brand hex leaves near-grey chrome rather than 12% of a
248
+ saturation nobody asked for. A base color overrides all of that with its own, clipped to
249
+ 50.
250
+
251
+ **The shipped value is `12`** — a faint tint is what a neutral surface _is_ — so the
252
+ interesting range is the low end. The base colors keep their proportions to one another
253
+ until the highest of them (`0.475`, `surface-inverse`) hits the top of the scale, around
254
+ `25`; past that they converge.
255
+
256
+ Note the asymmetry with the accent's saturation: writing the base's does **not** turn
257
+ `pastel` off. How much hue the chrome carries says nothing about which chroma space the
258
+ palette is in.
259
+
260
+ ### Tinted surfaces
261
+
262
+ A neutral `surface` sits at the extreme of the tone scale — pure white in light,
263
+ the darkest step the dark tone window allows in dark. Chroma needs distance from
264
+ the extreme to exist at all, so on a light page `surface` is white whatever the base
265
+ saturation asks for. The base seed reaches `surface-2`…`surface-4`, `border`,
266
+ `placeholder` and the text ramp, and stops at the page itself.
267
+
268
+ `surfaceMode: 'tinted'` moves the whole ramp two tones inward:
269
+
270
+ ```ts
271
+ setPaletteConfig({ surfaceMode: 'tinted', base: { saturation: 25 } });
272
+ ```
273
+
274
+ Two tones is not a lightness change you would name — it is _room_. Everything below
275
+ `surface` is positioned relative to it, so the ladder, the borders and the text ramp
276
+ all follow, and the text's `['AA','AAA']` floors re-solve against the new background
277
+ rather than drifting. The `code-*` family follows too: its mirrored `surface` exists
278
+ to be the page, so it tracks both the tone and the base seed.
279
+
280
+ **The tinted surfaces move with it.** A status theme's `surface` — and a runtime
281
+ tint's, from `getColorTheme()` — is authored as an offset from the page's rather
282
+ than as an absolute tone, and that offset is exactly the two tones `tinted` shifts
283
+ by. Anchored absolutely they would land on the page's own new tone and a `note`
284
+ banner would stop reading as a banner at all; anchored to the page they keep the
285
+ separation the offset was chosen for, in both schemes. They also pick up a little
286
+ more chroma there, being further from the extreme — so `tinted` makes a status
287
+ surface easier to see, not harder.
288
+
289
+ The tint stays subtle by construction. Near white the sRGB gamut has very little
290
+ chroma to give, so `tinted` buys a surface that reads as warm or cool rather than
291
+ one that reads as colored — which is the whole ask. For a genuinely colored panel,
292
+ reach for a status theme's `surface` instead.
293
+
294
+ All of which describes the `pastel: false` path. Under `pastel` there is still one seed
295
+ and it is pinned to `100`, because a flat chroma ceiling is the whole mechanism and a
296
+ second scale on top of it would only undo the evenness. So there are two paths:
297
+
298
+ ```ts
299
+ setPaletteConfig({ pastel: true }); // even across hues; saturation is 100, full stop
300
+ setPaletteConfig({ accent: { saturation: 65 } }); // your scale, per-hue ceiling
301
+ ```
302
+
303
+ Note the second line does not mention `pastel`. **Setting the accent's `saturation` turns
304
+ pastel off**, because tuning a saturation is the non-pastel path by definition — so you
305
+ pick a path by asking for what you want from it, not by setting a flag first. A *color*
306
+ does not answer that question and does not turn pastel off: `accent: '#FFD400'` on its
307
+ own still resolves under the flat ceiling, contributing its hue and tone but not its
308
+ chroma.
91
309
 
92
- So the palette has one saturation _scale_, and everything on it keeps its
93
- proportions: turning `saturation` down mutes the brand fills and the neutral tint
94
- together, in the ratios the palette was designed around. That is the point the
95
- relationship between a subtle surface tint and a saturated accent is part of the
96
- design, not something to tune per token.
310
+ State `pastel` only to override that. It is the coarser of the two choices — a color
311
+ space rather than a value on one so it wins wherever both are set, and a saturation it
312
+ shadows is ignored with a dev-mode warning. The number is **kept** rather than dropped,
313
+ though: it stays in the sparse config, so turning pastel back off restores it.
97
314
 
98
315
  ### The `code-*` family is the exception
99
316
 
@@ -125,37 +342,60 @@ also why the pinned seed is a floor to respect rather than a number to tidy up.
125
342
 
126
343
  ### Inherited vs pinned
127
344
 
128
- Every per-theme field starts out **inheriting** the palette-level value, so
129
- `baseHue` tracks `hue` until something sets it, and `themes.<status>.saturation`
130
- tracks `saturation`. Moving the accent hue therefore appears to move the base hue
131
- too — they are not linked, `baseHue` simply has no value of its own yet.
345
+ Every zone's seed starts out **inheriting**: the base zone follows the accent until
346
+ something seeds it, and a status theme's saturation tracks the accent's. Moving the accent
347
+ hue therefore appears to move the base hue too they are not linked, the base zone simply
348
+ has no value of its own yet.
132
349
 
133
- Writing the field pins it; leaving it out of the config unpins it, so it inherits
134
- again:
350
+ Writing a seed pins it; leaving it out of the config unpins it, so it inherits again:
135
351
 
136
352
  ```ts
137
- setPaletteConfig({ baseHue: 60 }); // pin
138
- setPaletteConfig((config) => ({ ...config, hue: 235 })); // baseHue stays at 60
139
- setPaletteConfig({ hue: 235 }); // baseHue dropped — inherits again → 235
353
+ setPaletteConfig({ base: { hue: 60 } }); // pin
354
+ setPaletteConfig((config) => ({ ...config, accent: { hue: 235 } })); // base stays at 60
355
+ setPaletteConfig({ accent: { hue: 235 } }); // base dropped — follows again → 235
140
356
 
141
357
  // Same thing from inside an updater, when the rest of the config must survive.
142
- setPaletteConfig(({ baseHue, ...config }) => config);
358
+ setPaletteConfig(({ base, ...config }) => config);
143
359
  ```
144
360
 
145
- An explicit `baseHue: undefined` is equivalent to omitting it; neither is a value.
361
+ A zone is therefore **three-state**, and one field answers all three: absent and it
362
+ inherits, an object and it is pinned to numbers, a string and it is derived from a color.
363
+ A settings UI reads the sparse config to know which of its own controls is in charge:
146
364
 
147
- `getPaletteConfig()` resolves everything, which loses that distinction — it cannot
148
- tell you whether `100` was chosen or inherited. `getPaletteConfigInput()` returns the
149
- sparse config as set, which is what a settings UI needs to render an inherited value
150
- as inherited and offer a way back:
365
+ ```ts
366
+ const input = getPaletteConfigInput();
367
+ const accentMode = typeof input.accent === 'string' ? 'color' : 'numbers';
368
+ const baseIsOwn = input.base !== undefined;
369
+ ```
370
+
371
+ `base: {}` and no `base` at all resolve to the same colors, but they are not the same
372
+ config — one has a seed of its own that pins nothing, the other has no seed. The two read
373
+ back differently and both count as changes, because that distinction is exactly what a
374
+ **Follow accent / Own** control is.
375
+
376
+ Swapping one form for the other counts as a change even when the numbers agree — an
377
+ `accent: { hue: 45 }` replaced by a color that derives hue 45 resolves identically, but
378
+ the UI still has to re-render to move its mode control. So does replacing one unparseable
379
+ string with another, which is why the colors are compared by value rather than by
380
+ presence.
381
+
382
+ An explicit `{ hue: undefined }` inside a seed is equivalent to omitting the field;
383
+ neither is a value.
384
+
385
+ `getPaletteConfig()` resolves everything, which loses that distinction — it cannot tell
386
+ you whether `100` was chosen or inherited, and it always reports flat numbers whichever
387
+ way a zone was seeded. `getPaletteConfigInput()` returns the sparse config as set, which
388
+ is what a settings UI needs to render an inherited value as inherited and offer a way
389
+ back:
151
390
 
152
391
  ```ts
153
- const pinned = getPaletteConfigInput().baseHue !== undefined;
392
+ const seed = getPaletteConfigInput().base;
393
+ const pinnedHue = typeof seed === 'object' ? seed.hue : undefined;
154
394
  ```
155
395
 
156
- Pinning a field to the value it already inherited resolves to the same colors but
157
- still counts as a change, so a UI reading the sparse config re-renders. Re-applying
158
- an _already pinned_ value is a true no-op and costs nothing.
396
+ Pinning a field to the value it already inherited resolves to the same colors but still
397
+ counts as a change, so a UI reading the sparse config re-renders. Re-applying an _already
398
+ pinned_ value is a true no-op and costs nothing.
159
399
 
160
400
  ## Palette playground
161
401
 
@@ -174,8 +414,39 @@ Two things worth noticing while you tune:
174
414
 
175
415
  ## Status themes
176
416
 
177
- Each status theme is a Glaze `extend()` of the default theme with its own hue, so
178
- tuning one moves only its own `#<theme>-*` family.
417
+ Each status theme is a Glaze `extend()` of the default theme with its own seed, so tuning
418
+ one moves only its own `#<theme>-*` family.
419
+
420
+ That seed is a `PaletteSeed` like any other, so `danger` can be the red your product
421
+ already ships rather than a hue you reverse-engineered from it:
422
+
423
+ ```ts
424
+ setPaletteConfig({ themes: { danger: '#b91c1c', success: { hue: 150 } } });
425
+ ```
426
+
427
+ A status color behaves like the brand's in the ways that matter — the light,
428
+ normal-contrast fill reproduces it, dark and high contrast adapt, and the softened APCA
429
+ floors apply instead of the white-anchored ladder's WCAG ones, including the cap that
430
+ keeps the `#white` label on a `type="primary"` button readable.
431
+
432
+ **One thing is deliberately different: its chroma becomes the theme's seed.** An accent
433
+ color's does not, because all four status themes inherit the accent's saturation and
434
+ raising it would re-chromatise every one of them. Nothing inherits from a status theme,
435
+ so there is nothing to protect — and moving the seed is what holds the rest of the theme
436
+ in proportion to the fill. The tinted banner surface, the border and the text ramp are
437
+ authored as factors of the seed (`0.2`, `0.3`, `0.25`), so with the seed left at `100`
438
+ beside a muted fill the banner would read as fully tinted under a washed-out button.
439
+ Moving it keeps the shipped `1.0 : 0.2 : 0.3 : 0.25` ratio exactly.
440
+
441
+ Two consequences worth stating. A vivid status color under a muted palette gives one
442
+ vivid theme beside muted siblings — that is the point of naming a color. And under
443
+ `pastel` the flat ceiling can hold the fill below the color's own chroma while the banner
444
+ still sits at `0.2` of it, so the ratio drifts slightly; turn pastel off for an exact
445
+ color, exactly as with the brand.
446
+
447
+ A muted seed *beside* an accent color is not expressible, because the zone is seeded one
448
+ way or the other: a color there leaves the inherited saturation at its default. Mute the
449
+ status themes individually if you want that.
179
450
 
180
451
  ## Contrast level
181
452
 
@@ -183,29 +454,135 @@ By default contrast is a two-tier switch: normal colors plus a separate
183
454
  high-contrast set, selected by `<html data-contrast="high">` or a
184
455
  `prefers-contrast: more` preference.
185
456
 
186
- A manual `contrastLevel` replaces both tiers with a single 0–100 slider. Because
187
- the level already carries the contrast preference, **no separate high-contrast
188
- variant is emitted** which means `data-contrast="high"` and
189
- `prefers-contrast: more` stop having any effect while a level is set. Levels `0`
190
- and `100` reproduce the normal and high-contrast palettes bit for bit, so the
191
- slider is a continuous interpolation between exactly what the two tiers ship
192
- today.
457
+ A manual `contrastLevel` adds a 0–100 slider that positions the **normal** colors,
458
+ for a product that wants to offer its own contrast control. Level `0` is the
459
+ shipped palette and `100` is the high-contrast one, bit for bit, so the slider
460
+ interpolates between exactly what the two tiers already ship.
461
+
462
+ The two **compose**; the slider does not replace the switch. The high-contrast
463
+ tier stays the true high-contrast resolution at every level — identical to what
464
+ `'auto'` emits — so `data-contrast="high"` and `prefers-contrast: more` keep
465
+ working and escalate on top of wherever the slider has put the baseline.
193
466
 
194
- That is a real accessibility trade-off: leave `contrastLevel` at `'auto'` unless
195
- you are giving users their own contrast control.
467
+ The one exception is level `100`: there the normal colors already _are_ the
468
+ high-contrast ones, so a second tier would only duplicate them and a single
469
+ light/dark set is emitted.
470
+
471
+ Because level `0` reproduces `'auto'` exactly, tier included, shipping the slider
472
+ and defaulting it off costs a consumer nothing.
196
473
 
197
474
  ## Theme builder
198
475
 
199
476
  The `Theme Builder` story puts the whole config behind controls and renders the
200
- result into a single region: pick **Light / Dark**, then either a contrast **mode**
201
- (Normal / High) or a **custom** 0–100 level, and the preview shows exactly that
202
- variant while the page around it stays as it is.
203
-
204
- There is no `Auto` for scheme or contrast mode, on purpose. `Auto` means "follow
205
- the OS" a _preference_, and a flat token value cannot express one. A preview
206
- renders one concrete variant, so it has to name which. The contrast _level_ keeps
207
- its `Auto`, because there the choice is between the two-tier model and a hand-set
208
- number rather than between following and not following the system.
477
+ result into a single region, with one line drawn through the middle of the page:
478
+ **the left column is the theme, the two switches over the preview are the
479
+ viewing conditions.** Everything on the left writes to the palette config and
480
+ would ship with the product; **Light / Dark** and **Normal / High contrast**
481
+ write nothing at all the same theme renders in all four combinations, and
482
+ moving between them is how you check a theme rather than how you change one.
483
+
484
+ Those two switches start on whatever the surrounding page is already showing and
485
+ keep following it until you press one, after which they are yours. There is no
486
+ `Auto` option to press: `Auto` means "follow the OS" — a _preference_ — and the
487
+ preview resolves to flat token values, which can only express one concrete
488
+ variant. Following is the default behaviour rather than a third choice.
489
+
490
+ On the theme side, the panel is grouped by **what a knob reaches** rather than by
491
+ what it is named after: **Global** for the ones that govern both zones — `pastel`,
492
+ the accent saturation, `surfaceMode` and `contrastLevel` — then **Accent** and **Base** for
493
+ the ones that do not. `surfaceMode` files under Global despite moving the *base*
494
+ surfaces, because the status themes' tinted surfaces follow it too, and so does the
495
+ mirrored surface the syntax palette solves against.
496
+
497
+ Those headings are also why the field labels are bare. `Seeded by` and `Hue` appear
498
+ in both zones, and the heading above them is what says which — repeating it in
499
+ every label was two words of noise on every line of a narrow column.
500
+
501
+ The **contrast level** needs no on/off switch: level `0` and `'auto'` are
502
+ output-identical, tier included, so the slider at rest _is_ the shipped palette.
503
+
504
+ Status themes are four chips on one line rather than eight sliders. Each chip is a
505
+ `theme="current"` `Button` colored by its own theme with a
506
+ [ColorSwatch](./components/fields/ColorSwatch.md) of its accent, so the group answers
507
+ the question you actually have — do these four still read as four different
508
+ things — at a glance; press one to open its hue and saturation. The hue is not
509
+ printed on the chip: it belongs to the slider that sets it, and carrying it there
510
+ cost the whole row, since `success — 157°` is wide enough that four of them have
511
+ to stack.
512
+
513
+ **Reset**, **Export** and **JSON** sit at the top of the column, not the bottom.
514
+ The one button you reach for when an experiment goes wrong should not be behind
515
+ the controls that caused it. `Export` opens the config as a `setPaletteConfig()`
516
+ call to copy; `JSON` downloads `palette.json` on the press, with no intermediate
517
+ state worth a second click. Both carry the config _as written_ rather than the
518
+ resolved one, so an inherited `base` stays inherited instead of being frozen to
519
+ whatever the accent happened to be.
520
+
521
+ Every caveat on the panel is an **InfoBadge** beside the control it qualifies rather
522
+ than a paragraph under it. A tuner is a dense column of controls, and prose between
523
+ them pushes the next knob off the screen to explain something you need once.
524
+
525
+ ### Three states, one tab bar
526
+
527
+ An unlabelled tab bar spans the top of the panel, and everything below reads as the state
528
+ it has selected:
529
+
530
+ | | **Pastel** | **Advanced** | **Color** |
531
+ | ------------ | ----------------------- | ------------------------------------ | ------------------------- |
532
+ | **Accent** | Hue | Hue + Saturation | Color (hue+chroma+tone) |
533
+ | **Base** | Hue, or _Follow accent_ | Hue + Saturation, or _Follow accent_ | Color, or _Follow accent_ |
534
+ | **Status** | Hue | Hue + Saturation | Color |
535
+ | **Syntax** | Saturation | Saturation | Saturation |
536
+
537
+ `Advanced` and `Color` are the **same chroma space** — the per-hue ceiling — and differ
538
+ only in what you hand it. `Pastel` is the other space, and it takes hues because a flat
539
+ ceiling has nothing to do with a color.
540
+
541
+ It began as two controls, a `pastel` switch and a per-zone **Seeded by**, which described
542
+ a 2×2 grid with one impossible cell: pastel cannot honour a color, so one of the two spent
543
+ its life disabled. Three tabs spend three buttons on the three reachable states, and make
544
+ Pastel → Color one press instead of two. The bar carries no label, because naming it would
545
+ mean finding a word for "the palette" — and both candidates, _Mode_ and _Surfaces_, are
546
+ spoken for further down.
547
+
548
+ Two rules follow from it:
549
+
550
+ - **`pastel` gates saturation.** It is one flat, hue-independent ceiling, which is what
551
+ makes the palette even across hues and what leaves nothing for a saturation scale to
552
+ do. There is no saturation control in that state except the syntax one, which `pastel`
553
+ never reaches.
554
+ - **A derived control is not shown.** Whatever a seed already supplies, its slider goes
555
+ away rather than sitting on screen disabled. A disabled slider under a color seed is a
556
+ read-out dressed as a control, and it cost two rows to repeat what the color field
557
+ above it already said.
558
+
559
+ The base zone keeps its own **Follow accent | Own**, which is orthogonal to the tabs: it
560
+ is about whether the chrome has a seed at all, not about how a seed is spelled.
561
+
562
+ Every transition hands the incoming controls the values the outgoing ones were displaying,
563
+ so switching changes who is in charge without repainting on the way. Leaving `Color`
564
+ therefore pins each zone at what its color derived and drops the hex — including on the
565
+ way to `Pastel`, which cannot honour a color at all. Status themes pin their **hue** only:
566
+ a saturation pinned on the way out would survive into `Pastel`, where it is inert but
567
+ still in effect, and that is not a state to manufacture on a tab press.
568
+
569
+ The two halves of the way *in* differ, and both are deliberate. The brand zones open on a
570
+ fixed sample hex, so the flip changes which control is in charge rather than reading the
571
+ page back to itself. The four status themes convert instead — each to the fill it is
572
+ already emitting — because four sample hexes would repaint every banner on a tab press,
573
+ and a status theme's identity is a *meaning* a sample color has no business overwriting.
574
+ Coming from `Advanced`, the same chroma space, that conversion lands the banner back where
575
+ it was; coming from `Pastel` the palette repaints regardless, since the tabs turn `pastel`
576
+ off and a change of chroma space is the one thing no hand-over can carry across.
577
+
578
+ In color mode the panel shows where the color actually landed — **Accent Fill** and
579
+ **Accent Text**, the two tokens the seed's tone reaches. The requested color is not
580
+ repeated beside them: the field above holds it, with a swatch of its own.
581
+
582
+ The **preset** buttons show which one is active, and stop showing it the moment you
583
+ touch a control. The setter replaces rather than merges, so a preset is either the
584
+ whole config or it is not the config at all; anything else would claim a theme is
585
+ still `Ocean` after you had re-seeded half of it.
209
586
 
210
587
  The preview deliberately shows all three surface levels with their own text ramps
211
588
  (`#surface-text`, `#surface-2-text`, `#surface-3-text`), because a theme that looks
@@ -225,7 +602,7 @@ import { renderColorTokens, tasty } from '@cube-dev/ui-kit';
225
602
  const Region = tasty({ styles: { fill: '#surface', color: '#surface-text' } });
226
603
 
227
604
  const preview = useMemo(
228
- () => renderColorTokens({ hue: 210, scheme: 'dark' }),
605
+ () => renderColorTokens({ accent: { hue: 210 }, scheme: 'dark' }),
229
606
  [],
230
607
  );
231
608
 
@@ -267,8 +644,10 @@ Notes:
267
644
  - `contrastLevel` works per region, so the whole 0–100 ramp can be shown at once —
268
645
  something a document cannot do, since it is only ever at one level. Level `0`
269
646
  reproduces the normal tier and `100` the high-contrast tier exactly, in both
270
- schemes. Because a manual level leaves no separate high-contrast tier,
271
- `highContrast: true` correctly returns the same colors as the normal variant.
647
+ schemes. `highContrast: true` still returns the genuine high-contrast
648
+ resolution at any level below `100`, because the level moves the baseline and
649
+ the tier escalates from where `'auto'` would put it; at `100` the two coincide
650
+ and it returns the same colors as the normal variant.
272
651
  Note that tokens carrying a contrast _floor_ (most text) can sit still over part
273
652
  of the ramp — the floor is solved, not approximated, so the value only moves once
274
653
  the interpolated target does. Tokens positioned by a plain tone pair, like
@@ -295,7 +674,7 @@ import {
295
674
  // on change. `palette` is the resolved config; the updater's argument is sparse.
296
675
  const [palette, setPalette] = usePaletteConfig();
297
676
 
298
- setPalette((config) => ({ ...config, hue: 200 }));
677
+ setPalette((config) => ({ ...config, accent: { ...config.accent, hue: 200 } }));
299
678
 
300
679
  // Outside React.
301
680
  getPaletteConfig(); // every field resolved to a concrete value
@@ -314,7 +693,7 @@ it. `DEFAULT_PALETTE_CONFIG` is the shipped baseline in the same shape.
314
693
  paint is already correct:
315
694
 
316
695
  ```tsx
317
- <Root palette={{ hue: userAccentHue }}>
696
+ <Root palette={{ accent: userBrandColor }}>
318
697
  <App />
319
698
  </Root>
320
699
  ```
@@ -350,9 +729,18 @@ therefore re-tunes nothing — a seed picked in one space lands somewhere else i
350
729
  other, and the warm statuses move most. Re-tune the seeds alongside it, in whichever
351
730
  direction you flip.
352
731
 
732
+ It also owns the accent's `saturation` outright — pinned to `100`, so a number passed
733
+ _explicitly alongside_ it is inert and warned about (a number passed on its own turns
734
+ pastel off instead). And it caps a color seed short of itself: the ceiling sits below
735
+ where a saturated color lands, so `#EF4444` resolves to `#c47069`. Both are visible in the
736
+ [Theme builder](#theme-builder), the first as a disabled slider and the second as the
737
+ requested/resolved chips.
738
+
353
739
  **Re-seeding costs about 10 ms.** Rebuilding the eight themes and re-solving
354
740
  ~156 tokens across four scheme variants is not free, though it is inside a frame.
355
- A manual `contrastLevel` is cheaper, since it skips both high-contrast passes.
741
+ A manual `contrastLevel` costs the same it runs the same four passes — except
742
+ at level `100`, which skips the two high-contrast ones because the normal pass
743
+ already produced those values.
356
744
  Setting the config to a value it already holds is free — it does not even bump
357
745
  the version. If you are driving it from a slider, let the input coalesce to
358
746
  frames (a pointer-driven `onChange` already does) rather than writing on every