@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
@@ -61,13 +61,15 @@ clipped by an ancestor's `overflow: hidden`.
61
61
  - **`compact`** `'vertical' | 'horizontal' | 'free' | null` (default: `'vertical'`) — Compaction behavior. `'vertical'`/`'horizontal'` reflow widgets to remove gaps; `'free'` places each widget exactly where dropped and never pushes its neighbours (blocked from occupied cells unless `allowOverlap`); `null` disables compaction but still resolves collisions the legacy react-grid-layout way.
62
62
  - **`allowOverlap`** `boolean` (default: `false`) — Allow widgets to overlap (stack). In `'free'` mode this is what distinguishes stacking from blocking a drop onto an occupied cell.
63
63
  - **`preventCollision`** `boolean` (default: `false`) — Block movement into occupied cells instead of pushing.
64
+ - **`collisionMode`** `'revert' | 'downscale' | 'swap'` (default: `'revert'`) — How to resolve a drop the grid would otherwise refuse. Only applies where a collision *blocks* a move — `compact="free"` (which prevents collisions) or an explicit `preventCollision` — and never under `allowOverlap`, where nothing is blocked. `'revert'` snaps the widget back. `'downscale'` shrinks it into the free space at the drop cell, growing rightward and downward, floored at its `minW`/`minH` (below that it reverts). `'swap'` trades places with **one** widget — the one the drop covers most — which takes the cell the drag began at, each keeping as much of its own size as fits there (so a widget displaced next to a neighbour may shrink). It never displaces more than that one widget. A drop straddling two widgets trades with one of them rather than refusing, so the swap never blinks away as you sweep across a boundary; ties go to the widget earlier in reading order. Dragging back retraces the original arrangement exactly. It falls back to `'downscale'`, then `'revert'`. No mode ever *grows* a widget: a drag only ever preserves or reduces size. Applies to single-widget drags. Arrow keys honour it too but never resize anything — each press is a gesture of its own, so a press that shrank a widget would have nothing to restore from, and only an exchange that fits outright is allowed. A multi-widget selection still only moves where it fits outright, and a resize is still blocked by a collision.
64
65
  - **`isDraggable`** `boolean` (default: `true`) — Enable dragging for all widgets.
65
66
  - **`isResizable`** `boolean` (default: `true`) — Enable resizing for all widgets.
66
67
  - **`isDroppable`** `boolean` (default: `true`) — Whether the board accepts widgets dropped from other boards.
67
68
  - **`resizeHandles`** `ResizeHandleAxis[]` (default: `['se']`) — Which resize handles to show. Corner handles (`ne`/`nw`/`se`/`sw`) show an angle grip; edge handles (`n`/`s`/`e`/`w`) show a dotted grip. Both are revealed on hover/focus/resize. A single edge (e.g. `['e']` or `['s']`) gives a horizontally- or vertically-only resizable widget.
69
+ - **`resizeGripPlacement`** `'inside' | 'corner'` (default: `'inside'`) — Where the corner grips sit. `'inside'` tucks each one into the widget box; `'corner'` centres it on the widget's corner, so it lines up with a control centred on the opposite corner. Only affects corner handles — a dotted edge grip always stays inside. A corner-placed grip is drawn *outside* the widget (a widget clips its own content, which would otherwise cut the grip in half), so it needs the board to have at least half a grip's worth of `containerPadding` to show in full against the board's edge. Its hit-zone moves out with it and overhangs by the same half-grip, so the whole visible grip is grabbable and hovering it keeps it revealed — the trade is a ~5px band just outside each corner where a press starts a resize rather than a marquee. Can be overridden per widget.
68
70
  - **`dragCancel`** `string` — CSS selector for elements that must not start a pointer drag (e.g. form controls inside a widget: `"input,textarea,button,a,.no-drag"`). Does not affect keyboard moves — those only run when the widget host itself is focused. Can be overridden per widget.
69
71
  - **`dragHandle`** `string` — CSS selector for the only elements from which a pointer drag may start. Can be overridden per widget.
70
- - **`showGridLines`** `boolean | 'drag'` (default: `false`) — Show grid lines behind the widgets. `true` always, `'drag'` only while a widget is being dragged or resized. A nested board that does not set this inherits an enabled ancestor's grid lines, showing its own while a drag is in progress.
72
+ - **`showGridLines`** `boolean | 'drag' | 'any-drag'` (default: `false`) — Show grid lines behind the widgets. `true` always; `false` never; `'drag'` only while *this* board is part of the active gesture — it owns the drag (as its source, or as the board the widget is currently over) or one of its own widgets is being resized; `'any-drag'` while any drag is in flight anywhere under a shared `Board.Provider`, so every board advertises itself as somewhere the widget could land. Under one `Board.Provider`, `'drag'` keeps boards a widget cannot land in quiet, and `'any-drag'` is the opt-in for the noisier, more informative version. A nested board that does not set this inherits an enabled ancestor's setting, at the ancestor's own scope.
71
73
  - **`isAligned`** `boolean` (default: `false`) — Align a nested board with its ancestor `Board`'s layout. Only takes effect when the board is nested inside another `Board`'s widget. When set, every cell matches the parent's cell size exactly: the board inherits the parent's column pitch (deriving its own column count from its measured width so cells stay parent-sized as the container is resized) and uses the parent's row height verbatim. It never shrinks rows to fit — pair it with an `isAutoHeight` container so the widget grows to fit its rows at that height. `cols`/`rowHeight` then act as fallbacks used only until the parent metrics resolve.
72
74
  - **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'none'`) — Whether widgets can be selected, and how many at a time. `'multiple'` also enables the marquee and rigid group movement.
73
75
  - **`selectedKeys`** `string[]` — Controlled selection. Keys are layout item ids (`LayoutItem.i`).
@@ -89,6 +91,7 @@ clipped by an ancestor's `overflow: hidden`.
89
91
  - **`isDraggable`** `boolean` — Disable dragging for this widget.
90
92
  - **`isResizable`** `boolean` — Disable resizing for this widget.
91
93
  - **`resizeHandles`** `ResizeHandleAxis[]` — Override the board's handles.
94
+ - **`resizeGripPlacement`** `'inside' | 'corner'` — Override the board's grip placement.
92
95
  - **`minW`** `number` — Minimum width in grid columns. Used when the layout item omits `minW`; the resize handle stops here.
93
96
  - **`maxW`** `number` — Maximum width in grid columns. Used when the layout item omits `maxW`.
94
97
  - **`minH`** `number` — Minimum height in grid rows. Used when the layout item omits `minH`.
@@ -237,7 +240,22 @@ Bound resizing with per-widget `minW`/`maxW` (columns) and `minH`/`maxH` (rows).
237
240
 
238
241
  ### Grid lines
239
242
 
240
- Show grid lines behind the widgets while dragging or resizing (or always).
243
+ Show grid lines behind the widgets while dragging or resizing (or always). With
244
+ several boards under one `Board.Provider`, `'drag'` lights up only the board the
245
+ drag belongs to; `'any-drag'` lights up all of them.
246
+
247
+ ### Corner resize grip
248
+
249
+ Centre the resize grip on the widget's corner with `resizeGripPlacement="corner"`,
250
+ so it lines up with a control centred on the opposite corner.
251
+
252
+ ### Resolving a blocked drop
253
+
254
+ On a free grid a drop onto occupied cells is refused. `collisionMode` resolves it
255
+ instead: `'downscale'` shrinks the widget into whatever room is at the drop cell,
256
+ `'swap'` trades places with the widget already there. Neither ever grows a widget.
257
+ One board per mode below — drag the wide widget onto the row below in the first,
258
+ and drop a widget onto one of its neighbours in the second.
241
259
 
242
260
  ### Card widgets
243
261
 
@@ -0,0 +1,48 @@
1
+ # NoDataIcon
2
+
3
+ The empty isometric crate — the kit's "nothing here yet" illustration.
4
+
5
+ It is an **illustration, not a member of the icon set**, which is why it lives in `Other/` rather than under `Content/Icons`. It is still built on `Icon`, so it sizes and accepts style props exactly like one.
6
+
7
+ ## When to Use
8
+
9
+ - An empty table, list, or card grid — "No invoices yet", "No deployments yet"
10
+ - A full-page empty state, paired with a short line of copy
11
+ - Anywhere `LoadingAnimation` would sit if the same view were still loading
12
+
13
+ ## Sizing
14
+
15
+ `size` maps onto `font-size` and drives both axes; the artwork is square.
16
+
17
+ ```jsx
18
+ <NoDataIcon size="8x" />
19
+ ```
20
+
21
+ Unlike a glyph icon, the drawing is full-bleed in its viewBox rather than inset in a 24×24 grid, so it is meant for illustration sizes — `size="8x"` (64px) and up. At icon sizes it will read as noticeably heavier than the glyphs around it.
22
+
23
+ ## Colour
24
+
25
+ Not a `currentColor` glyph, so it **ignores `color`**. The three faces come from the shared isometric cube-face tokens (`#loading-face-1` … `#loading-face-3`) that [`LoadingAnimation`](../status/LoadingAnimation.md) also draws from, so an empty table and a loading table read as the same object lit the same way.
26
+
27
+ That ramp is positioned by a WCAG floor against `#surface`, so each face keeps the same separation from the page in light, dark, and high contrast, and follows a re-seeded brand hue as a tint rather than as a colour. Recolouring one face and not the others would break the shading, which is why there is no prop for it.
28
+
29
+ ## Properties
30
+
31
+ - **`size`** `Styles['fontSize']` — Icon size; drives both axes
32
+
33
+ ### Base Properties
34
+
35
+ Supports [Base properties](../../BaseProperties.md).
36
+
37
+ ### Style Properties
38
+
39
+ Accepts the same style props as `Icon` — outer, base, and color style props.
40
+
41
+ ## Examples
42
+
43
+ ```jsx
44
+ <Flow gap="1x" placeItems="center">
45
+ <NoDataIcon size="8x" />
46
+ <Paragraph>No invoices yet.</Paragraph>
47
+ </Flow>
48
+ ```
@@ -36,6 +36,7 @@ DialogTrigger serves as a wrapper around a Dialog and its associated trigger, li
36
36
  - **`targetRef`** — The ref of the element the Dialog should visually attach itself to
37
37
  - **`styles`** — The style map for the overlay
38
38
  - **`shouldCloseOnInteractOutside`** — Function to determine if overlay should close on outside interaction
39
+ - **`shouldRestoreFocus`** `boolean` (default: `true`) — Whether focus returns to the trigger when the dialog closes. Only needed for a surface that claims focus *later* than the restore (async load, entry animation); an action that focuses the surface it opens is already left alone — see [Focus Management](#best-practices)
39
40
 
40
41
  ### Base Properties
41
42
 
@@ -52,7 +53,7 @@ These properties allow direct style application without using the `styles` prop:
52
53
  - **Base:** `display`, `font`, `preset`, `hide`, `whiteSpace`, `opacity`, `transition`
53
54
  - **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
54
55
  - **Block:** `border`, `radius`, `shadow`, `outline`, `padding`, `paddingInline`, `paddingBlock`, `overflow`, `scrollbar`, `textAlign`
55
- - **Flow:** `flow`, `placeItems`, `placeContent`, `alignItems`, `alignContent`, `justifyItems`, `justifyContent`, `align`, `justify`, `gap`, `columnGap`, `rowGap`, `gridColumns`, `gridRows`, `gridTemplate`, `gridAreas`
56
+ - **Flow:** `flow`, `place`, `placeItems`, `placeContent`, `alignItems`, `alignContent`, `justifyItems`, `justifyContent`, `align`, `justify`, `gap`, `columnGap`, `rowGap`, `gridColumns`, `gridRows`, `gridTemplate`, `gridAreas`
56
57
 
57
58
  ## Variants
58
59
 
@@ -186,7 +187,7 @@ function ControlledDialog() {
186
187
  </DialogTrigger>
187
188
  ```
188
189
 
189
- 3. **Focus Management**: Always ensure focus returns properly after dialog closes
190
+ 3. **Focus Management**: Closing the dialog returns focus to the trigger, unless the action that closed it already moved focus somewhere else — an action that opens a panel or another dialog just focuses that surface, and the trigger leaves it alone. A single `focus()` from a mount effect is enough; no retry loop is needed. Reach for `shouldRestoreFocus={false}` only when the opened surface claims focus *later* than the restore (after an async load or an entry animation), where the trigger would otherwise take focus first and flash.
190
191
  4. **Mobile Considerations**: Use appropriate mobile types for better UX
191
192
  5. **Dismissible**: Make modal dialogs dismissible unless absolutely necessary
192
193
 
@@ -36,3 +36,15 @@ These properties allow direct style application without using the `styles` prop:
36
36
 
37
37
  <LoadingAnimation size="large" />
38
38
  ```
39
+
40
+ ## Colors
41
+
42
+ The cube's three faces come from the shared isometric-cube tokens
43
+ (`#loading-face-1` … `#loading-face-3`), a near-neutral ramp positioned by a WCAG
44
+ floor against `#surface`. Each face therefore keeps the same separation from the
45
+ page in light, dark, and high contrast, and follows a re-seeded brand hue as a
46
+ tint rather than as a color. There is no `color` prop to override — recolouring
47
+ one face and not the others would break the shading.
48
+
49
+ [`NoDataIcon`](../other/NoDataIcon.md) draws its empty crate from the same
50
+ three tokens, so a loading table and an empty table read as the same object.
package/docs/glaze/api.md CHANGED
@@ -411,9 +411,9 @@ promotion for that color.
411
411
 
412
412
  ## Manual contrast level
413
413
 
414
- `contrastLevel` turns contrast from a two-tier switch into a `0–100` slider.
415
- It is a config field, so it works globally, per theme, per token, and through
416
- `extend()`:
414
+ `contrastLevel` puts the normal end of the two-tier contrast model on a `0–100`
415
+ slider. It is a config field, so it works globally, per theme, per token, and
416
+ through `extend()`:
417
417
 
418
418
  ```ts
419
419
  glaze.configure({ contrastLevel: 60 });
@@ -421,12 +421,17 @@ const theme = glaze(280, 80, { contrastLevel: 60 });
421
421
  glaze.color('#26fcb2', { contrastLevel: 60 });
422
422
  ```
423
423
 
424
- | Value | Meaning |
425
- | ---------------- | -------------------------------------------------------------------- |
426
- | `'auto'` | Default. The two-tier model: normal variants plus a high-contrast tier. |
427
- | `0` | Normal contrast, with **no** high-contrast tier. |
428
- | `100` | The high-contrast scheme as the only scheme. |
429
- | anything between | Resolved *at* that level. |
424
+ The level moves the **normal** variants — `light` and `dark` — along that slider.
425
+ It says nothing about high contrast: `lightContrast` / `darkContrast` stay the
426
+ true high-contrast resolution at every level, and
427
+ [`modes.highContrast`](#output-modes) alone decides whether they are emitted.
428
+
429
+ | Value | Meaning |
430
+ | ---------------- | -------------------------------------------------------------------------- |
431
+ | `'auto'` | Default. The normal variants take the authored normal entries as-is. |
432
+ | `0` | The same thing, reached through the slider — output-identical to `'auto'`. |
433
+ | `100` | The normal variants *are* the high-contrast ones, so the tier is dropped. |
434
+ | anything between | The normal variants are resolved *at* that level. |
430
435
 
431
436
  Levels `0` and `100` reproduce the classic `light` / `dark` and
432
437
  `lightContrast` / `darkContrast` output **bit for bit**.
@@ -446,6 +451,9 @@ The interpolated values are then fed through the ordinary resolve, so a
446
451
  contrast floor at any level is **solved**, not approximated, and `autoFlip`
447
452
  decides once per level.
448
453
 
454
+ These feed the two **normal** passes only. The high-contrast passes bypass the
455
+ level entirely, so the tier resolves exactly as it does in `'auto'` mode.
456
+
449
457
  Everything that does not vary by high contrast today — hue, saturation,
450
458
  `darkDesaturation`, `opacity`, `pastel` — is unaffected by the level.
451
459
 
@@ -495,24 +503,35 @@ directly.
495
503
 
496
504
  ### High-contrast output
497
505
 
498
- A manual level already carries the contrast preference, so there is no second
499
- tier to emit:
500
-
501
- - `resolve()` still returns four variants, but `lightContrast` / `darkContrast`
502
- **mirror** `light` / `dark`.
503
- - A **global** level turns high-contrast output off outright, so
504
- `tokens()` / `tasty()` / `json()` / `dtcg()` / `dtcgResolver()` / `tailwind()`
505
- emit no high-contrast tier. `modes.highContrast` goes inert it reads as
506
- "emit a separate high-contrast set *when* contrast is automatic" so leaving
507
- `highContrast: true` set in a build config while a user switches their
508
- preference from auto to manual is fine, and silent.
506
+ The level and the high-contrast tier are independent, and they compose: the
507
+ slider raises the baseline, and a `prefers-contrast: more` block still escalates
508
+ on top of whatever baseline the user has chosen.
509
+
510
+ - `resolve()` returns four variants at every level. `lightContrast` /
511
+ `darkContrast` are the **true** high-contrast resolution bit-identical to
512
+ what `'auto'` resolves for those slots, at any level.
513
+ - [`modes.highContrast`](#output-modes) alone decides whether the tier is
514
+ emitted, exactly as in `'auto'` mode. A level does not turn it off.
509
515
  - `css()` always returns four strings and ignores `modes`, so its
510
- `lightContrast` / `darkContrast` strings repeat the normal declarations
511
- an existing `@media (prefers-contrast: more)` block keeps matching the base
512
- block as the level changes, with nothing to rewire.
516
+ `lightContrast` / `darkContrast` strings now carry genuinely escalated values
517
+ at a mid level, where they previously repeated the normal declarations. An
518
+ existing `@media (prefers-contrast: more)` block starts doing real work.
513
519
  - A level on a **single theme or token** does not change which modes are
514
- emitted. Sibling themes in a palette keep their real high-contrast tier, and
515
- the manual one reports its own resolved values there.
520
+ emitted `modes` is global-only, and a palette must not have one sibling
521
+ collapse the shared token structure.
522
+
523
+ | `contrastLevel` | `modes.highContrast: false` (default) | `modes.highContrast: true` |
524
+ | ----------------- | ------------------------------------- | ---------------------------------------- |
525
+ | `'auto'` / `0` | `light`, `dark` | + `lightContrast`, `darkContrast` |
526
+ | `1`–`99` | `light`, `dark` at the level | + the tier, unchanged by the level |
527
+ | `100` (global) | `light`, `dark` = the HC values | same — the tier is dropped as a duplicate |
528
+
529
+ That last row is the one exception. At level 100 the normal variants *are* the
530
+ high-contrast ones, so a separate tier would be an exact duplicate: a global
531
+ level of 100 emits a single light/dark set, and even an explicit
532
+ `modes: { highContrast: true }` on the call is suppressed, because it has nothing
533
+ different left to ask for. A level of 100 on a single theme or token still
534
+ reports into the tier, with values equal to its own normal ones.
516
535
 
517
536
  ### Driving it at runtime
518
537
 
@@ -526,8 +545,9 @@ slider.oninput = () => {
526
545
  };
527
546
  ```
528
547
 
529
- Because a manual level skips the two high-contrast passes, a manual resolve is
530
- also half the work of an `'auto'` one.
548
+ A manual resolve runs the same four passes as an `'auto'` one. Only level 100
549
+ skips the two high-contrast passes, because the normal ones already produced
550
+ those values.
531
551
 
532
552
  ### Clearing it, exporting it, base links
533
553
 
@@ -540,7 +560,9 @@ also half the work of an `'auto'` one.
540
560
  matches how `modes` and `states` are treated.
541
561
  - **Set the level globally, or on both sides of a base link.** A per-token level
542
562
  on a dependent but not on its base anchors the two at different levels — the
543
- same caveat as a per-instance `lightTone` override.
563
+ same caveat as a per-instance `lightTone` override. It is visible in the
564
+ high-contrast tier too, since a dependent's high-contrast variant reads its
565
+ base's high-contrast slots (and at level 100, the base's mirrored normal ones).
544
566
 
545
567
  `resolveContrastForLevel(spec, level, polarity?)` is exported for advanced use;
546
568
  see [Contrast solver](#contrast-solver).
@@ -559,8 +581,9 @@ type ColorDef = RegularColorDef | ShadowColorDef | MixColorDef;
559
581
 
560
582
  | Field | Type | Description |
561
583
  | ------------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
562
- | `tone` | `HCPair<ToneValue>` | Number = absolute (0–100). `'+N'`/`'-N'` = a signed **tone delta** from the base (requires `base`). `'max'`/`'min'` = forced to the scheme's tone extreme (no `base`). Optional HC pair `[normal, hc]`. |
563
- | `saturation` | `number` | Saturation factor applied to the seed saturation (0–1). Default: `1`. |
584
+ | `from` | `GlazeColorValue` | Seed this color from a literal value (hex, `rgb()`, `hsl()`, `okhsl()`, `okhst()`, `oklch()`, or a value object). Supplies `hue`, `tone`, and an **absolute** saturation the one way a theme color escapes the seed ceiling. Light/normal-contrast reproduces it exactly. See [`from`](#from-a-literal-color). |
585
+ | `tone` | `HCPair<ToneValue>` | Number = absolute (0–100). `'+N'`/`'-N'` = a signed **tone delta** from the base (requires `base`). `'max'`/`'min'` = forced to the scheme's tone extreme (no `base`). Optional HC pair `[normal, hc]`. Defaults to the tone of `from`. |
586
+ | `saturation` | `number` | Saturation factor applied to the seed saturation (0–1). Default: `1`. With `from`, setting it overrides the color's absolute saturation and reverts to a factor of the seed. |
564
587
  | `hue` | `number \| RelativeValue` | Number = absolute (0–360). String (`'+N'`/`'-N'`) = relative to the **theme seed hue** (never to a base color). |
565
588
  | `darkHue` | `number \| RelativeValue` | Dark-scheme hue. Number = absolute (0–360). String = relative to the **theme dark seed hue**. Falls back to `hue`. See [Dark seed](#dark-seed-darkhue--darksaturation). |
566
589
  | `darkSaturation` | `number` | Dark-scheme saturation factor (0–1) over the dark seed saturation. Falls back to `saturation`. When set, the global `darkDesaturation` reduction is **not** applied on top. |
@@ -573,6 +596,61 @@ type ColorDef = RegularColorDef | ShadowColorDef | MixColorDef;
573
596
  | `role` | `RoleInput` | Semantic role against `base` (`'text'` / `'surface'` / `'border'` or an alias). Fixes APCA contrast polarity. Resolved via: explicit `role` → name inference → opposite of the base's role → `'text'`. See [Roles](#roles). |
574
597
  | `inherit` | `boolean` | Whether this color is inherited by child themes via `extend()`. Default: `true`. Set to `false` to make the color local to the current theme. |
575
598
 
599
+ #### `from` (a literal color)
600
+
601
+ Most of Glaze answers the question "design me a palette". `from` answers the
602
+ other one: **"honor this color."** White-label products, multi-tenant branding
603
+ and imported design tokens all arrive with a value already chosen, and it is a
604
+ contract rather than a starting point.
605
+
606
+ ```ts
607
+ const theme = glaze(280, 80);
608
+
609
+ theme.colors({
610
+ surface: { tone: 100, saturation: 0.12 },
611
+ brand: { from: '#2f5bff', base: 'surface', contrast: 3 },
612
+ });
613
+ ```
614
+
615
+ It accepts the same values as [`glaze.color()`](#input-forms) and supplies three
616
+ things at once: `hue`, `tone`, and — uniquely among theme colors — an
617
+ **absolute saturation**.
618
+
619
+ That last one is the point. Every other color's `saturation` is a 0–1 factor of
620
+ the theme seed, so the seed is a ceiling: without `from`, the only way to place
621
+ a color more saturated than its theme is to re-seed the whole theme, dragging
622
+ every sibling along. A `from` color carries its own chroma and is unaffected by
623
+ the seed:
624
+
625
+ ```ts
626
+ // Identical output at every seed saturation — the color is the color.
627
+ for (const seed of [5, 50, 100]) {
628
+ glaze(280, seed).colors({ brand: { from: '#2f5bff' } }); // → #2f5bff
629
+ }
630
+ ```
631
+
632
+ **What "exactly" covers.** The **light, normal-contrast** variant reproduces the
633
+ value (a local `lightTone: false`, the same default the value-shorthand form of
634
+ `glaze.color()` applies). Dark and high contrast adapt as usual. That asymmetry
635
+ is deliberate: those are the variants a reader reaches for when the normal one
636
+ does not work for them, so readability outranks fidelity there — and a color
637
+ pinned across all four would just be a worse `mode: 'static'`.
638
+
639
+ A `contrast` floor still applies in every scheme and is still a floor, not a
640
+ target: a value that already clears it is emitted untouched, and one that misses
641
+ moves only as far as the floor. Because the floor is solved per scheme, which
642
+ scheme comes out exact depends on the color — a light brand cannot clear 3:1 on
643
+ a white page but clears it easily on a dark one.
644
+
645
+ Sibling fields win over what the value supplied, so `{ from: '#2f5bff', hue: 300 }`
646
+ keeps the saturation and tone and rotates the hue. Note that a `saturation`
647
+ written alongside `from` reverts to its usual meaning — a factor of the seed,
648
+ not of the color.
649
+
650
+ A `from` color needs no `base` and no `tone`: it is placed absolutely, so it
651
+ stands as a root on its own. Add `base` + `contrast` when it has to stay legible
652
+ against something.
653
+
576
654
  #### Tone values
577
655
 
578
656
  `tone` (0–100) replaces authored OKHSL lightness with a contrast-shaped axis.
@@ -599,7 +677,7 @@ delta is kept and clamped on the authored side.
599
677
 
600
678
  **Extreme tone** (`'max'` / `'min'`) forces the color to the scheme's tone extreme without a contrast hack or a magic number. `'max'` resolves to author tone 100 and `'min'` to 0. Without a `base`, both flow through scheme mapping like an absolute tone, so under `mode: 'auto'` they invert in dark (`'max'` is lightest in light, darkest in dark). Use `mode: 'static'` to pin the same extreme across schemes, or `mode: 'fixed'` to keep the same end without inverting. No `base` required.
601
679
 
602
- **Extreme tone with a `base`** keeps the pair's contrast across schemes. The tone windows are asymmetric by default (`lightTone: [10, 100]`, `darkTone: [15, 95]`), so re-mapping the extreme through the dark window would squeeze the base-to-extreme span and cost contrast. Instead Glaze measures the tone shift the light scheme applied between the base and the extreme, then replays it against the base's resolved dark tone — mirrored under `mode: 'auto'` (both ends invert), same-signed under `'fixed'`. The result is clamped to `[0, 100]` only, so it may cross the `darkTone` window edge; that is intentional, since the author asked for the extreme. When the shift does not fit above or below the dark base, the color pins at tone 100 / 0. `mode: 'static'` is unaffected, and high-contrast variants already use the full range.
680
+ **Extreme tone with a `base`** keeps the pair's contrast across schemes. The tone windows are asymmetric by default (`lightTone: [10, 100]`, `darkTone: [15, 95]`), so re-mapping the extreme through the dark window would squeeze the base-to-extreme span and cost contrast. Instead Glaze measures the tone shift the light scheme applied between the base and the extreme, then replays it against the base's resolved dark tone — mirrored under `mode: 'auto'` (both ends invert), same-signed under `'fixed'`. The result is clamped to `[0, 100]` only, so it may cross the `darkTone` window edge; that is intentional, since the author asked for the extreme. When the shift does not fit above or below the dark base, the color pins at tone 100 / 0. `mode: 'static'` is unaffected. High-contrast variants follow the same rule, but since their window is already the full range the replay reproduces the plain mapping unless the base itself sits asymmetrically across schemes.
603
681
 
604
682
  ```ts
605
683
  theme.colors({
@@ -1711,11 +1789,11 @@ boundaries, not the tone transfer.
1711
1789
  | `states.dark` | `'@media(prefers-color-scheme: dark)'` | State alias for dark mode tokens ([Tasty](https://tasty.style) export). Defaults to a media query so tokens react to the OS preference without registering custom states. |
1712
1790
  | `states.highContrast` | `'@media(prefers-contrast: more)'` | State alias for HC tokens ([Tasty](https://tasty.style) export). |
1713
1791
  | `modes.dark` | `true` | Include dark variants in exports. |
1714
- | `modes.highContrast` | `false` | Include HC variants. Inert while a global [`contrastLevel`](#manual-contrast-level) is set a manual level has no separate HC tier, so this reads as "emit HC variants when contrast is automatic". |
1792
+ | `modes.highContrast` | `false` | Include HC variants. Independent of [`contrastLevel`](#manual-contrast-level) the level positions the normal variants while these stay the true HC resolution. A global level of `100` is the exception: the tier would duplicate the normal set, so it is dropped. |
1715
1793
  | `shadowTuning` | `undefined` | Default tuning for all shadow colors. Per-color tuning merges field-by-field. |
1716
1794
  | `autoFlip` | `true` | Default for each color's `autoFlip`. When solving `contrast` (or applying a relative `tone` that overshoots `[0, 100]`), allow crossing to the opposite side instead of clamping. With `false`, only the requested direction is considered; unmet contrasts pin the tone to that direction's extreme (and emit a warning) and overshooting offsets clamp to the boundary. Override per color via [`autoFlip`](#autoflip). |
1717
1795
  | `inferRole` | `true` | Infer each color's [`role`](#roles) from its name when no explicit `role` is set. Set to `false` to opt out of name-based inference (the base-opposite and foreground-default fallbacks still apply). |
1718
- | `contrastLevel` | `'auto'` | Manual contrast level, `0`–`100`, replacing the two-tier high-contrast model with a slider. `0` reproduces the normal output and `100` the high-contrast output, bit for bit. See [Manual contrast level](#manual-contrast-level). |
1796
+ | `contrastLevel` | `'auto'` | Manual contrast level, `0`–`100`, putting the **normal** variants on a slider between themselves and the high-contrast ones. `0` reproduces the normal output and `100` the high-contrast output, bit for bit. The HC tier is unaffected. See [Manual contrast level](#manual-contrast-level). |
1719
1797
 
1720
1798
  | Method | Description |
1721
1799
  | ------------------------- | ----------------------------------------------------------------------------------- |
@@ -1723,7 +1801,7 @@ boundaries, not the tone transfer.
1723
1801
  | `glaze.getConfig()` | Snapshot the current resolved config (shallow copy). |
1724
1802
  | `glaze.resetConfig()` | Reset to defaults (also bumps the version counter). |
1725
1803
 
1726
- Themes and standalone color tokens keep a sparse local `GlazeConfigOverride` and merge the live global at resolve time for omitted fields. Authoring `.export(override?)` freezes the effective merge at call time; restored instances pin that freeze. `pastel` is instance-only (theme/token override or per-color) — not set via `configure()`. `contrastLevel` is the one field the freeze treats as a live preference: only an instance-authored level is written to the snapshot ([why](#two-rules-worth-knowing)).
1804
+ Themes and standalone color tokens keep a sparse local `GlazeConfigOverride` and merge the live global at resolve time for omitted fields. Authoring `.export(override?)` freezes the effective merge at call time; restored instances pin that freeze. `pastel` is instance-only (theme/token override or per-color) — not set via `configure()`. `contrastLevel` is the one field the freeze treats as a live preference: only an instance-authored level is written to the snapshot ([why](#clearing-it-exporting-it-base-links)).
1727
1805
 
1728
1806
  ---
1729
1807
 
@@ -1745,9 +1823,10 @@ palette.tokens({ modes: { dark: true, highContrast: true } });
1745
1823
 
1746
1824
  Resolution priority (highest first):
1747
1825
 
1748
- 1. A global [`contrastLevel`](#manual-contrast-level) — pins
1749
- `highContrast: false`, since a manual level leaves no separate high-contrast
1750
- tier to emit. `highContrast` is inert while it is set.
1826
+ 1. A global [`contrastLevel`](#manual-contrast-level) of `100` — pins
1827
+ `highContrast: false`, since the normal variants already *are* the
1828
+ high-contrast ones and the tier would duplicate them. Any other level leaves
1829
+ `highContrast` alone.
1751
1830
  2. Per-call `modes` option on `tokens` / `tasty` / `json`.
1752
1831
  3. `glaze.configure({ modes })` — global config.
1753
1832
  4. Built-in default: `{ dark: true, highContrast: false }`.
@@ -1817,7 +1896,7 @@ import {
1817
1896
  | Function | Description |
1818
1897
  | ------------------------------------- | ------------------------------------------------------------------------ |
1819
1898
  | `okhslToLinearSrgb(h, s, l)` | OKHSL (h: 0–360, s/l: 0–1) → linear sRGB tuple. |
1820
- | `okhslToSrgb(h, s, l)` | OKHSL → gamma-encoded sRGB tuple (0–1 per channel). |
1899
+ | `okhslToSrgb(h, s, l)` | OKHSL (h: 0–360, s/l: 0–1) → gamma-encoded sRGB tuple (0–1 per channel). |
1821
1900
  | `okhslToOklab([h, s, l])` | OKHSL → OKLab `[L, a, b]`. |
1822
1901
  | `oklabToOkhsl([L, a, b])` | OKLab → OKHSL. |
1823
1902
  | `srgbToOkhsl([r, g, b])` | Gamma sRGB (0–1) → OKHSL. |
@@ -1830,15 +1909,44 @@ import {
1830
1909
 
1831
1910
  ### Format writers
1832
1911
 
1912
+ Every writer takes `h` on 0–360 and `s` / `l` / `t` on **0–1** — the scale every
1913
+ conversion above *returns*, and the scale `resolve()` stores in a
1914
+ `ResolvedColorVariant`. The percentages are an output detail: the writers scale
1915
+ by 100 themselves where the CSS syntax asks for one. (The one thing on a
1916
+ different scale is the pair of tone transfers below, `toTone` / `fromTone`,
1917
+ which speak the 0–100 tone axis the authoring API takes.)
1918
+
1833
1919
  ```ts
1834
- import { formatOkhsl, formatRgb, formatHsl, formatOklch } from '@tenphi/glaze';
1920
+ import {
1921
+ formatOkhsl,
1922
+ formatOkhst,
1923
+ formatRgb,
1924
+ formatHsl,
1925
+ formatOklch,
1926
+ } from '@tenphi/glaze';
1835
1927
 
1836
- formatOkhsl(280, 60, 95); // 'okhsl(280 60% 95%)'
1837
- formatRgb(280, 60, 95); // 'rgb(244 240 250)'
1838
- formatHsl(280, 60, 95); // 'hsl(280 60% 95%)'
1839
- formatOklch(280, 60, 95); // 'oklch(0.95 ... 280)'
1928
+ formatOkhsl(280, 0.6, 0.95); // 'okhsl(280 60% 95%)'
1929
+ formatOkhst(280, 0.6, 0.95); // 'okhst(280 60% 95%)'
1930
+ formatRgb(280, 0.6, 0.95); // 'rgb(238.45 239.95 251.1)'
1931
+ formatHsl(280, 0.6, 0.95); // 'hsl(232.92 61.87% 95.99%)'
1932
+ formatOklch(280, 0.6, 0.95); // 'oklch(0.9571 0.015 280)'
1840
1933
  ```
1841
1934
 
1935
+ So a producer composes with a writer directly, with nothing to rescale in
1936
+ between:
1937
+
1938
+ ```ts
1939
+ const v = glaze.color('#7A4DBF').resolve().light;
1940
+ const { h, s, l } = variantToOkhsl(v);
1941
+
1942
+ formatOkhst(v.h, v.s, v.t); // 'okhst(298.52 70.41% 45.02%)'
1943
+ formatOkhsl(h, s, l); // 'okhsl(298.52 70.41% 45.27%)'
1944
+ formatRgb(h, s, l); // 'rgb(122 77 191)'
1945
+ ```
1946
+
1947
+ A value above 1 can only be pre-2.0 percentage-scale input, so the writers
1948
+ `console.warn` about it once per writer rather than emit a wrong color quietly.
1949
+
1842
1950
  To attach an alpha component, use `glaze.format(variant, format)` on a `ResolvedColorVariant` (which carries the `alpha` channel) instead of these raw writers.
1843
1951
 
1844
1952
  ### OKHST tone utilities
@@ -1858,12 +1966,12 @@ import {
1858
1966
 
1859
1967
  | Function | Description |
1860
1968
  | ------------------------------------------- | ------------------------------------------------------------------------- |
1861
- | `toTone(l, eps?)` | OKHSL lightness (0–1) → tone (0–100). Defaults to `REF_EPS`. |
1862
- | `fromTone(t, eps?)` | Tone (0–100) → OKHSL lightness (0–1). Inverse of `toTone`. |
1969
+ | `toTone(l, eps?)` | OKHSL lightness (0–1) → tone (**0–100**, the authoring scale — divide by 100 for `formatOkhst`). Defaults to `REF_EPS`. |
1970
+ | `fromTone(t, eps?)` | Tone (**0–100**) → OKHSL lightness (0–1). Inverse of `toTone`. |
1863
1971
  | `toneFromY(y, eps?)` / `yFromTone(t, eps?)` | Same transfer in luminance space (0–1). |
1864
1972
  | `okhstToOkhsl({ h, s, t })` | OKHST → OKHSL (`{ h, s, l }`). |
1865
1973
  | `okhslToOkhst({ h, s, l })` | OKHSL → OKHST (`{ h, s, t }`). |
1866
- | `variantToOkhsl(variant)` | `ResolvedColorVariant` (stores `t`) → `{ h, s, l, alpha }` for rendering. |
1974
+ | `variantToOkhsl(variant)` | `ResolvedColorVariant` (stores `t`) → `{ h, s, l }` for rendering (`alpha` stays on the variant). |
1867
1975
  | `REF_EPS` | Reference epsilon (`0.05`) for the canonical tone axis. |
1868
1976
 
1869
1977
  `ResolvedColorVariant` stores `{ h, s, t, alpha }` (tone, not lightness). Use
@@ -1908,6 +2016,6 @@ Exported constants: `APCA_PRESETS`, `APCA_HC_ENHANCEMENT` (`15`, the Enhanced Le
1908
2016
  | `maxIterations` | `18` | Max binary-search iterations per branch. |
1909
2017
  | `initialDirection` | higher-contrast side | Direction to search first (`'lighter'` or `'darker'`). |
1910
2018
  | `flip` | `false` | When `true`, try the opposite direction if the initial one doesn't meet the target. When `false`, only the initial direction is searched — unmet contrasts pin the result to that direction's extreme. |
1911
- | `preferInitial` | `false` | With `flip` on and **both** directions meeting the target, keep `initialDirection` instead of taking whichever result lands nearer `preferredTone`. Makes the chosen side independent of the target — what [`contrastLevel`](#manual-contrast-level) uses to keep a color on one side of its base across the ramp. The flip fallback is unaffected. |
2019
+ | `preferInitial` | `false` | With `flip` on and **both** directions meeting the target, keep `initialDirection` instead of taking whichever result lands nearer `preferredTone`. Makes the chosen side independent of the target — what [`contrastLevel`](#manual-contrast-level) uses to keep a color on one side of its base across the ramp (on the normal passes only; the high-contrast ones never probe). The flip fallback is unaffected. |
1912
2020
 
1913
2021
  Result: `{ tone, contrast, met, branch: 'lighter' | 'darker' | 'preferred', flipped? }`. `flipped: true` indicates the initial direction failed and the opposite direction satisfied the target.
@@ -642,24 +642,26 @@ In HC variants, Glaze bypasses the normal tone window and uses the full
642
642
  `[0, 100]` range. Edge tones can reach the edge; contrast floors have more room
643
643
  to solve.
644
644
 
645
- ### A slider instead of a tier
645
+ ### A slider through the tier
646
646
 
647
647
  The two-tier model assumes contrast is a binary OS preference. When contrast is
648
648
  instead a setting *your users* control, set
649
- [`contrastLevel`](api.md#manual-contrast-level) to a number and the HC tier
650
- becomes a `0–100` ramp: level `0` is your normal palette, `100` is the HC
651
- palette you already authored, and everything between is resolved at that level.
649
+ [`contrastLevel`](api.md#manual-contrast-level) to a number and your **normal**
650
+ palette slides along a `0–100` ramp: level `0` is the palette you authored, `100`
651
+ is the HC palette you authored, and everything between is resolved at that level.
652
652
 
653
653
  The authoring work is the same — the HC pairs above are what the slider ramps
654
- toward, so a palette tuned for high contrast needs no new fields. Two
655
- consequences worth planning for:
656
-
657
- - The separate HC tier stops being emitted, so wire the level itself into your
658
- build or runtime rather than a `prefers-contrast: more` block. Existing
659
- media-query wiring keeps working; it just receives the same values as the base
660
- block.
661
- - `contrastLevel: 0` is a useful state in its own right: normal contrast with no
662
- HC tier at all, for products that ship the slider but default it off.
654
+ toward, so a palette tuned for high contrast needs no new fields. Two things
655
+ worth planning for:
656
+
657
+ - The slider and the tier compose. The HC tier keeps resolving at full contrast
658
+ regardless of the level, so wire the level into your build or runtime *and*
659
+ keep your `prefers-contrast: more` block: a user who has raised the slider and
660
+ asked their OS for more contrast still gets the escalation on top. The one
661
+ exception is level `100`, where the two coincide and the tier is dropped as a
662
+ duplicate.
663
+ - `contrastLevel: 0` is the natural rest position for a slider you ship but
664
+ default off — it reproduces the `'auto'` output bit for bit.
663
665
 
664
666
  ## Checklist
665
667
 
@@ -12,6 +12,7 @@ If you're starting from scratch, see [methodology.md](methodology.md) first —
12
12
  - [Wiring exports into the app](#wiring-exports-into-the-app)
13
13
  - [Prefix map strategies](#prefix-map-strategies)
14
14
  - [Migrating an existing color system](#migrating-from-an-existing-color-system)
15
+ - [Upgrading Glaze](#upgrading-glaze)
15
16
  - [Common pitfalls](#common-pitfalls)
16
17
 
17
18
  ## Choosing an export
@@ -296,6 +297,40 @@ Glaze gives you light/dark/HC for free, but only the light mode is matched again
296
297
 
297
298
  After migration, mark every default-only token (borders, shadows, disabled chip, code highlighting, etc.) `inherit: false`. Colored sibling themes only need the accent + tinted-surface chain — flagging the rest cuts the emitted token set per theme dramatically.
298
299
 
300
+ ## Upgrading Glaze
301
+
302
+ ### 2.0 — `format*` takes 0–1
303
+
304
+ The `format*` writers (`formatOkhsl`, `formatOkhst`, `formatRgb`, `formatHsl`,
305
+ `formatOklch`) used to take `s` / `l` / `t` on a 0–100 percentage scale while
306
+ everything that *produces* those values — `resolve()`, `variantToOkhsl`,
307
+ `srgbToOkhsl`, `oklabToOkhsl`, `okhslToSrgb` — returns them on 0–1. Composing
308
+ the two, which is the obvious thing to do, was off by 100x and failed silently:
309
+ `0.7` is a legal percentage, so you got a valid CSS string naming the wrong
310
+ (near-black) color.
311
+
312
+ The writers now take the 0–1 factors, so the whole library speaks one scale.
313
+ Drop the `* 100`:
314
+
315
+ ```diff
316
+ - formatOkhsl(v.h, v.s * 100, l * 100);
317
+ + formatOkhsl(v.h, v.s, l);
318
+
319
+ - formatOkhst(v.h, v.s * 100, v.t * 100);
320
+ + formatOkhst(v.h, v.s, v.t);
321
+ ```
322
+
323
+ Nothing else moves: `h` was always 0–360, `alpha` was always 0–1, and every
324
+ export method (`css()` / `tokens()` / `json()` / `tasty()` / `dtcg()` /
325
+ `tailwind()` / `glaze.format()`) emits the same colors — they were compensating
326
+ internally. Dropping the redundant `×100 ÷100` round-trip shifts float noise by
327
+ an ULP, which shows up nowhere except the (meaningless) hue term of a
328
+ fully-desaturated `hsl()` string.
329
+
330
+ A leftover `* 100` is not silent any more: a value above 1 cannot be a factor,
331
+ so the writers `console.warn` once per writer and you get an obviously-broken
332
+ `7040.68%` instead of a plausible wrong color.
333
+
299
334
  ## Common pitfalls
300
335
 
301
336
  | Symptom | Cause | Fix |
@@ -307,6 +342,7 @@ After migration, mark every default-only token (borders, shadows, disabled chip,
307
342
  | A relative `tone` like `'+48'` lands on the _wrong_ (darker) side of its base. | Overshooting offsets now mirror to the other side of the base by default (`autoFlip` inherits `autoFlip`). | Set `autoFlip: false` on the color to clamp to the boundary instead, or use `tone: 'max'`/`'min'` to force the extreme. |
308
343
  | `palette.tokens()` emits unexpected unprefixed names. | A `primary` was set on the palette (or per-call) and is duplicating the theme's tokens without prefix. | Pass `primary: false` to disable for that export, or rename `glaze.palette(themes, { primary })`. |
309
344
  | `console.warn: token "foo" collides with theme "bar"`. | Two themes resolved to the same output key under your prefix config. | Adjust the prefix map so each token is unique, or accept the first-write-wins behavior. |
345
+ | `console.warn: formatOkhsl() got a value above 1`. | Pre-2.0 percentage-scale input to a `format*` writer (a leftover `* 100`). | Pass the 0–1 factors the converters return — see [2.0 — `format*` takes 0–1](#20--format-takes-01). |
310
346
  | `console.warn: color "X" cannot meet contrast`. | The requested contrast target is physically unreachable for the color's hue/saturation against its base. | Lower the floor, change the base, or accept the closest passing variant. Use the `name` override on standalone colors to make the warning identifiable. |
311
347
 
312
348
  ## See also
@@ -98,6 +98,10 @@ hi(f) = hi + (100 - hi) * f
98
98
  `[15, 95] → [0, 100]`. The render `eps` is not interpolated, and a `false` window
99
99
  is already the full range and therefore level-invariant.
100
100
 
101
+ This continuous form applies to the normal variants only. High-contrast variants
102
+ are already at the full range, so the level does not widen them further — the
103
+ bypass above is what makes the high-contrast tier level-independent.
104
+
101
105
  ## Scheme adaptation
102
106
 
103
107
  Each regular color has an adaptation `mode`:
@@ -70,6 +70,9 @@ The last row goes the other way — longhands over the shorthand — because `fl
70
70
  - ❌ `#f5f5f5`, `rgb(0 0 0)`, `oklch(…)`, `okhsl(…)`, `red` → ✅ `#surface` (add the token to the config if it doesn't exist).
71
71
  - ❌ `var(--gap)` → ✅ `$gap` · ❌ `$accent-color` → ✅ `#accent` · ❌ `transparent` → ✅ `#clear` · ❌ `currentColor` → ✅ `#current`.
72
72
  - A `$name` must be declared as a `'$name': value` key in the same styles object, or in the config.
73
+ - Names are case-sensitive and start lowercase — `$myVar` → `--myVar`; a leading capital folds (`$Foo` → `--foo`). Prefer kebab-case.
74
+ - A `$name` reference is untyped: it fills the first free slot in a shorthand (`border: '1bw $my-style'` → the line style). Write colors as `#name`; `$name-color` is a fallback for pointing at a raw CSS custom property that holds a color.
75
+ - `preset` and `transition` take token *names*, not values, so a `$name` cannot stand in for one (it warns in dev and is ignored).
73
76
 
74
77
  ### Units
75
78