@cube-dev/ui-kit 0.204.0 → 0.206.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 (642) hide show
  1. package/dist/CHANGELOG.md +36 -0
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.js +1 -1
  16. package/dist/components/Root.js.map +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemActionsWrapper.js +221 -132
  28. package/dist/components/actions/ItemActionsWrapper.js.map +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/ItemButton/ItemButton.js.map +1 -1
  31. package/dist/components/actions/Link/Link.js +1 -1
  32. package/dist/components/actions/Menu/Menu.js +1 -1
  33. package/dist/components/actions/Menu/MenuCollectionItem.js +1 -1
  34. package/dist/components/actions/Menu/MenuItem.js +1 -1
  35. package/dist/components/actions/Menu/MenuSection.js +1 -1
  36. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  37. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  39. package/dist/components/actions/Menu/context.js +1 -1
  40. package/dist/components/actions/Menu/styled.js +1 -1
  41. package/dist/components/actions/actions-run.js +1 -1
  42. package/dist/components/actions/index.js +1 -1
  43. package/dist/components/actions/use-action.js +1 -1
  44. package/dist/components/actions/use-anchored-menu.js +1 -1
  45. package/dist/components/actions/use-context-menu.js +1 -1
  46. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  47. package/dist/components/content/Alert/Alert.js +1 -1
  48. package/dist/components/content/Alert/use-alert.js +1 -1
  49. package/dist/components/content/Avatar/Avatar.js +1 -1
  50. package/dist/components/content/Badge/Badge.js +1 -1
  51. package/dist/components/content/Card/Card.js +1 -1
  52. package/dist/components/content/Content.js +1 -1
  53. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  54. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  55. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  56. package/dist/components/content/Divider/Divider.js +1 -1
  57. package/dist/components/content/Footer.js +1 -1
  58. package/dist/components/content/Header.js +1 -1
  59. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  60. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  61. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  62. package/dist/components/content/Item/Item.d.ts +2 -1
  63. package/dist/components/content/Item/Item.js +1 -1
  64. package/dist/components/content/Item/Item.js.map +1 -1
  65. package/dist/components/content/Item/ItemWithNativeLinks.js +1 -1
  66. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  67. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  68. package/dist/components/content/Layout/GridLayout.js +1 -1
  69. package/dist/components/content/Layout/Layout.js +1 -1
  70. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  71. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  72. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  73. package/dist/components/content/Layout/LayoutContent.js +1 -1
  74. package/dist/components/content/Layout/LayoutContext.js +1 -1
  75. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  76. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  77. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  78. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  79. package/dist/components/content/Layout/LayoutPane.js +1 -1
  80. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  81. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  82. package/dist/components/content/Layout/LayoutPanelTransition.js +1 -1
  83. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  84. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  85. package/dist/components/content/Layout/index.js +1 -1
  86. package/dist/components/content/Layout/utils.js +1 -1
  87. package/dist/components/content/Paragraph.js +1 -1
  88. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  89. package/dist/components/content/PrismCode/PrismCode.js +3 -2
  90. package/dist/components/content/PrismCode/PrismCode.js.map +1 -1
  91. package/dist/components/content/PrismCode/prismSetup.js +8 -2
  92. package/dist/components/content/PrismCode/prismSetup.js.map +1 -1
  93. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  94. package/dist/components/content/Result/Result.js +1 -1
  95. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  96. package/dist/components/content/Tag/Tag.js +1 -1
  97. package/dist/components/content/Text.js +1 -1
  98. package/dist/components/content/TextItem/TextItem.d.ts +5 -2
  99. package/dist/components/content/TextItem/TextItem.js +1 -1
  100. package/dist/components/content/TextItem/TextItem.js.map +1 -1
  101. package/dist/components/content/Title.js +1 -1
  102. package/dist/components/content/Tree/Tree.js +1 -1
  103. package/dist/components/content/Tree/TreeNode.js +1 -1
  104. package/dist/components/content/Tree/checked-keys.js +1 -1
  105. package/dist/components/content/Tree/rowId.js +1 -1
  106. package/dist/components/content/Tree/styled.js +1 -1
  107. package/dist/components/content/Tree/tree-index.js +1 -1
  108. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  109. package/dist/components/content/Tree/use-load-data.js +1 -1
  110. package/dist/components/content/highlightText.js +1 -1
  111. package/dist/components/content/use-auto-tooltip.js +114 -72
  112. package/dist/components/content/use-auto-tooltip.js.map +1 -1
  113. package/dist/components/data/DataTable/DataTable.js +1 -1
  114. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  115. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  116. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  117. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  118. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  119. package/dist/components/data/ItemTable/item-table-sections.js +1 -1
  120. package/dist/components/data/ItemTable/use-item-table-column-widths.js +1 -1
  121. package/dist/components/data/ItemTable/use-item-table-drag-drop.js +1 -1
  122. package/dist/components/data/ItemTable/use-item-table-pagination.js +1 -1
  123. package/dist/components/data/ItemTable/use-item-table-selection.js +1 -1
  124. package/dist/components/data/ItemTable/use-item-table-sort.js +1 -1
  125. package/dist/components/data/ItemTable/use-item-table-tree-model.js +1 -1
  126. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  127. package/dist/components/data/TableBase/RowCollection.js +1 -1
  128. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  129. package/dist/components/data/TableBase/TableRow.js +1 -1
  130. package/dist/components/data/TableBase/TableRowLink.js +1 -1
  131. package/dist/components/data/TableBase/TableView.js +1 -1
  132. package/dist/components/data/TableBase/TreeGridTable.js +1 -1
  133. package/dist/components/data/TableBase/column-header.js +1 -1
  134. package/dist/components/data/TableBase/column-menu.js +1 -1
  135. package/dist/components/data/TableBase/column-styles.js +1 -1
  136. package/dist/components/data/TableBase/column-tint.js +1 -1
  137. package/dist/components/data/TableBase/row-menu.js +1 -1
  138. package/dist/components/data/TableBase/styled.js +21 -20
  139. package/dist/components/data/TableBase/styled.js.map +1 -1
  140. package/dist/components/data/TableBase/table-body-sections.js +1 -1
  141. package/dist/components/data/TableBase/table-tree.js +1 -1
  142. package/dist/components/data/TableBase/types.js +1 -1
  143. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  144. package/dist/components/data/TableBase/use-column-menu.js +1 -1
  145. package/dist/components/data/TableBase/use-column-order.js +1 -1
  146. package/dist/components/data/TableBase/use-column-window.js +1 -1
  147. package/dist/components/data/TableBase/use-container-width.js +1 -1
  148. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  149. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  150. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  151. package/dist/components/data/TableBase/use-table-search.js +1 -1
  152. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  153. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  154. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  155. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  156. package/dist/components/data/TableBase/use-table-tooltip-refresh.js +1 -1
  157. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  158. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  159. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  160. package/dist/components/fields/Checkbox/context.js +1 -1
  161. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  162. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  163. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  164. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  165. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  166. package/dist/components/fields/ComboBox/comboBoxOptions.js +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/CalendarPopover.js +281 -0
  171. package/dist/components/fields/DatePicker/CalendarPopover.js.map +1 -0
  172. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  173. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  174. package/dist/components/fields/DatePicker/DatePicker.js +26 -24
  175. package/dist/components/fields/DatePicker/DatePicker.js.map +1 -1
  176. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  177. package/dist/components/fields/DatePicker/DatePickerElement.js +4 -2
  178. package/dist/components/fields/DatePicker/DatePickerElement.js.map +1 -1
  179. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  180. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  181. package/dist/components/fields/DatePicker/DateRangePicker.d.ts +10 -0
  182. package/dist/components/fields/DatePicker/DateRangePicker.js +143 -65
  183. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  184. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +172 -165
  185. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
  186. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  187. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  188. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  189. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  190. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  191. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  192. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  193. package/dist/components/fields/DatePicker/period.js +1 -1
  194. package/dist/components/fields/DatePicker/props.js +1 -1
  195. package/dist/components/fields/DatePicker/utils.js +1 -1
  196. package/dist/components/fields/FileInput/FileInput.js +1 -1
  197. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  198. package/dist/components/fields/FilterListBox/styled.js +1 -1
  199. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  200. package/dist/components/fields/FilterPicker/FilterTree.js +1 -1
  201. package/dist/components/fields/Input/Input.js +1 -1
  202. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  203. package/dist/components/fields/ListBox/ListBox.js +1 -1
  204. package/dist/components/fields/ListBox/optionId.js +1 -1
  205. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  206. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  207. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  208. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  209. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  210. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  211. package/dist/components/fields/Picker/Picker.js +1 -1
  212. package/dist/components/fields/RadioGroup/Radio.js +108 -118
  213. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  214. package/dist/components/fields/RadioGroup/RadioGroup.js +10 -12
  215. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  216. package/dist/components/fields/RadioGroup/context.js +1 -1
  217. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  218. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  219. package/dist/components/fields/Select/Select.js +1 -1
  220. package/dist/components/fields/Slider/Gradation.js +1 -1
  221. package/dist/components/fields/Slider/HueSlider.js +1 -1
  222. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  223. package/dist/components/fields/Slider/Slider.js +1 -1
  224. package/dist/components/fields/Slider/SliderBase.js +1 -1
  225. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  226. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  227. package/dist/components/fields/Slider/elements.js +1 -1
  228. package/dist/components/fields/Slider/index.js +1 -1
  229. package/dist/components/fields/Switch/Switch.js +1 -1
  230. package/dist/components/fields/TagInput/TagInput.js +1 -1
  231. package/dist/components/fields/TagInput/TagList.js +1 -1
  232. package/dist/components/fields/TagInput/useActiveOption.js +1 -1
  233. package/dist/components/fields/TagInput/useTagError.js +1 -1
  234. package/dist/components/fields/TextArea/TextArea.js +1 -1
  235. package/dist/components/fields/TextInput/TextInput.js +1 -1
  236. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  237. package/dist/components/fields/TextInput/displayed-validation.js +1 -1
  238. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  239. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  240. package/dist/components/fields/TriggerActions.js +1 -1
  241. package/dist/components/fields/color/ColorPanel.js +1 -1
  242. package/dist/components/fields/color/channels.js +1 -1
  243. package/dist/components/fields/color/color.js +1 -1
  244. package/dist/components/fields/color/context.js +1 -1
  245. package/dist/components/fields/option-origin-press.js +1 -1
  246. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  247. package/dist/components/form/FieldWrapper/field-description.js +1 -1
  248. package/dist/components/form/Form/Field.js +1 -1
  249. package/dist/components/form/Form/Form.js +1 -1
  250. package/dist/components/form/Form/ModernFormRoot.js +198 -174
  251. package/dist/components/form/Form/ModernFormRoot.js.map +1 -1
  252. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  253. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  254. package/dist/components/form/Form/SubmitError.js +1 -1
  255. package/dist/components/form/Form/backend.js +1 -1
  256. package/dist/components/form/Form/index.js +1 -1
  257. package/dist/components/form/Form/modern/actions.js +1 -1
  258. package/dist/components/form/Form/modern/context.js +1 -1
  259. package/dist/components/form/Form/modern/controller.js +1 -1
  260. package/dist/components/form/Form/modern/field-binding.js +1 -1
  261. package/dist/components/form/Form/modern/field.js +1 -1
  262. package/dist/components/form/Form/modern/react.js +1 -1
  263. package/dist/components/form/Form/modern/store.js +18 -3
  264. package/dist/components/form/Form/modern/store.js.map +1 -1
  265. package/dist/components/form/Form/modern/validation.js +1 -1
  266. package/dist/components/form/Form/modern/values.js +1 -1
  267. package/dist/components/form/Form/reset-unbound-controls.js +1 -1
  268. package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
  269. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  270. package/dist/components/form/Form/use-field/use-field.js +1 -1
  271. package/dist/components/form/Form/use-form.js +1 -1
  272. package/dist/components/form/Form/validation.js +1 -1
  273. package/dist/components/form/Label.js +1 -1
  274. package/dist/components/form/field-chrome.js +1 -1
  275. package/dist/components/form/field-layout.js +1 -1
  276. package/dist/components/form/legacy-tooltip.js +1 -1
  277. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  278. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  279. package/dist/components/form/validation/use-validation-props.js +1 -1
  280. package/dist/components/form/wrapper.js +1 -1
  281. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  282. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  283. package/dist/components/layout/Flex.js +1 -1
  284. package/dist/components/layout/Flow.js +1 -1
  285. package/dist/components/layout/Grid.js +1 -1
  286. package/dist/components/layout/Panel.js +1 -1
  287. package/dist/components/layout/Prefix.js +1 -1
  288. package/dist/components/layout/ResizablePanel.js +1 -1
  289. package/dist/components/layout/Space.js +1 -1
  290. package/dist/components/layout/Suffix.js +1 -1
  291. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  292. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  293. package/dist/components/navigation/Tabs/BoardDragActiveProvider.js +1 -1
  294. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  295. package/dist/components/navigation/Tabs/TabButton.js +190 -187
  296. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  297. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  298. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  299. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  300. package/dist/components/navigation/Tabs/Tabs.js +2 -1
  301. package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
  302. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  303. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  304. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  305. package/dist/components/navigation/Tabs/segmented-styles.js +53 -0
  306. package/dist/components/navigation/Tabs/segmented-styles.js.map +1 -0
  307. package/dist/components/navigation/Tabs/styled.js +15 -28
  308. package/dist/components/navigation/Tabs/styled.js.map +1 -1
  309. package/dist/components/navigation/Tabs/types.d.ts +4 -4
  310. package/dist/components/navigation/Tabs/types.js +1 -1
  311. package/dist/components/navigation/Tabs/types.js.map +1 -1
  312. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  313. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  314. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  315. package/dist/components/other/Calendar/Calendar.js +1 -1
  316. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  317. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  318. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  319. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  320. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  321. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  322. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  323. package/dist/components/other/Calendar/styled.js +1 -1
  324. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  325. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  326. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  327. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  328. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  329. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  330. package/dist/components/overlays/Dialog/DialogContainer.d.ts +3 -3
  331. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  332. package/dist/components/overlays/Dialog/DialogContainer.js.map +1 -1
  333. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  334. package/dist/components/overlays/Dialog/DialogTrigger.d.ts +4 -4
  335. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  336. package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
  337. package/dist/components/overlays/Dialog/ModernDialogForm.js +101 -123
  338. package/dist/components/overlays/Dialog/ModernDialogForm.js.map +1 -1
  339. package/dist/components/overlays/Dialog/context.js +1 -1
  340. package/dist/components/overlays/Dialog/context.js.map +1 -1
  341. package/dist/components/overlays/Dialog/default-button-text.js +1 -1
  342. package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
  343. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  344. package/dist/components/overlays/Dialog/use-dialog-open-sync.js +1 -1
  345. package/dist/components/overlays/Dialog/use-dismiss-confirmation.js +60 -51
  346. package/dist/components/overlays/Dialog/use-dismiss-confirmation.js.map +1 -1
  347. package/dist/components/overlays/Dialog/use-retained-dialog-focus.js +1 -1
  348. package/dist/components/overlays/Modal/Modal.js +1 -1
  349. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  350. package/dist/components/overlays/Modal/Overlay.js +1 -1
  351. package/dist/components/overlays/Modal/Popover.js +1 -1
  352. package/dist/components/overlays/Modal/Tray.js +1 -1
  353. package/dist/components/overlays/Modal/Underlay.js +1 -1
  354. package/dist/components/overlays/Modal/modal-containment.js +1 -1
  355. package/dist/components/overlays/Notifications/Notification.js +1 -1
  356. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  357. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  358. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  359. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  360. package/dist/components/overlays/Notifications/OverlayContainer.js +6 -3
  361. package/dist/components/overlays/Notifications/OverlayContainer.js.map +1 -1
  362. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  363. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  364. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  365. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  366. package/dist/components/overlays/Notifications/index.js +1 -1
  367. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  368. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  369. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  370. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  371. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  372. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  373. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  374. package/dist/components/overlays/Toast/index.js +1 -1
  375. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  376. package/dist/components/overlays/Toast/useToast.js +1 -1
  377. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  378. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  379. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  380. package/dist/components/overlays/Tooltip/context.js +1 -1
  381. package/dist/components/overlays/Tooltip/split-trigger-props.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/Spin/Cube.js +2 -2
  390. package/dist/components/status/Spin/Cube.js.map +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.js +70 -70
  395. package/dist/data/item-themes.js.map +1 -1
  396. package/dist/data/themes.js +1 -1
  397. package/dist/eslint-plugin/defaults.generated.js +1 -1
  398. package/dist/eslint-plugin/index.js +1 -1
  399. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  400. package/dist/i18n/I18nProvider.js +1 -1
  401. package/dist/i18n/createFormatter.js +1 -1
  402. package/dist/i18n/index.js +1 -1
  403. package/dist/i18n/instance.js +1 -1
  404. package/dist/i18n/locales/de-DE/uikit.js +3 -2
  405. package/dist/i18n/locales/en-US/uikit.js +3 -2
  406. package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -0
  407. package/dist/i18n/locales/es-ES/uikit.js +3 -2
  408. package/dist/i18n/locales/es-MX/uikit.js +3 -2
  409. package/dist/i18n/locales/fr-FR/uikit.js +3 -2
  410. package/dist/i18n/locales/it-IT/uikit.js +3 -2
  411. package/dist/i18n/locales/ja-JP/uikit.js +3 -2
  412. package/dist/i18n/locales/nb-NO/uikit.js +3 -2
  413. package/dist/i18n/locales/pt-BR/uikit.js +3 -2
  414. package/dist/i18n/locales/pt-PT/uikit.js +3 -2
  415. package/dist/i18n/locales/sv-SE/uikit.js +3 -2
  416. package/dist/i18n/locales/vi-VN/uikit.js +3 -2
  417. package/dist/i18n/locales.js +1 -1
  418. package/dist/i18n/namespace.js +1 -1
  419. package/dist/i18n/useFormatter.js +1 -1
  420. package/dist/i18n/useI18n.js +1 -1
  421. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  422. package/dist/icons/AdjustmentsIcon.js +1 -1
  423. package/dist/icons/AiIcon.js +1 -1
  424. package/dist/icons/AreaChartIcon.js +1 -1
  425. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  426. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  427. package/dist/icons/BackwardIcon.js +1 -1
  428. package/dist/icons/BarChartIcon.js +1 -1
  429. package/dist/icons/BellFilledIcon.js +1 -1
  430. package/dist/icons/BellIcon.js +1 -1
  431. package/dist/icons/BooleanIcon.js +1 -1
  432. package/dist/icons/CalendarEditIcon.js +1 -1
  433. package/dist/icons/CalendarIcon.js +1 -1
  434. package/dist/icons/CaretDownIcon.js +1 -1
  435. package/dist/icons/CaretUpIcon.js +1 -1
  436. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  437. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  438. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  439. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  440. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  441. package/dist/icons/ChartBarLineIcon.js +1 -1
  442. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  443. package/dist/icons/ChartBarStackedIcon.js +1 -1
  444. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  445. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  446. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  447. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  448. package/dist/icons/ChartBubbleIcon.js +1 -1
  449. package/dist/icons/ChartDonut2Icon.js +1 -1
  450. package/dist/icons/ChartFunnelIcon.js +1 -1
  451. package/dist/icons/ChartHeatmapIcon.js +1 -1
  452. package/dist/icons/ChartKPIIcon.js +1 -1
  453. package/dist/icons/ChartPie2Icon.js +1 -1
  454. package/dist/icons/ChartScatterIcon.js +1 -1
  455. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  456. package/dist/icons/CheckCircleIcon.js +1 -1
  457. package/dist/icons/CheckIcon.js +1 -1
  458. package/dist/icons/CircleFilledIcon.js +1 -1
  459. package/dist/icons/ClearIcon.js +1 -1
  460. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  461. package/dist/icons/CloseCircleIcon.js +1 -1
  462. package/dist/icons/CloseIcon.js +1 -1
  463. package/dist/icons/CodeIcon.js +1 -1
  464. package/dist/icons/ColumnTotalIcon.js +1 -1
  465. package/dist/icons/CopyIcon.js +1 -1
  466. package/dist/icons/CountIcon.js +1 -1
  467. package/dist/icons/CubeIcon.js +1 -1
  468. package/dist/icons/CubePauseIcon.js +1 -1
  469. package/dist/icons/CubePlayIcon.js +1 -1
  470. package/dist/icons/CurrencyDollarIcon.js +1 -1
  471. package/dist/icons/DangerIcon.js +1 -1
  472. package/dist/icons/DashboardIcon.js +1 -1
  473. package/dist/icons/DatabaseIcon.js +1 -1
  474. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  475. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  476. package/dist/icons/DirectionIcon.js +1 -1
  477. package/dist/icons/DonutIcon.js +1 -1
  478. package/dist/icons/DownIcon.js +1 -1
  479. package/dist/icons/EditIcon.js +1 -1
  480. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  481. package/dist/icons/ExclamationCircleIcon.js +1 -1
  482. package/dist/icons/ExclamationIcon.js +1 -1
  483. package/dist/icons/EyeIcon.js +1 -1
  484. package/dist/icons/EyeInvisibleIcon.js +1 -1
  485. package/dist/icons/FilterIcon.js +1 -1
  486. package/dist/icons/FolderFilledIcon.js +1 -1
  487. package/dist/icons/FolderIcon.js +1 -1
  488. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  489. package/dist/icons/FolderOpenIcon.js +1 -1
  490. package/dist/icons/ForwardIcon.js +1 -1
  491. package/dist/icons/GripVerticalIcon.js +1 -1
  492. package/dist/icons/HierarchyIcon.js +1 -1
  493. package/dist/icons/HierarchyOpenIcon.js +1 -1
  494. package/dist/icons/Icon.js +1 -1
  495. package/dist/icons/InfoCircleIcon.js +1 -1
  496. package/dist/icons/InfoIcon.js +1 -1
  497. package/dist/icons/KeyIcon.js +1 -1
  498. package/dist/icons/LeftIcon.js +1 -1
  499. package/dist/icons/LineChartIcon.js +1 -1
  500. package/dist/icons/LoadingIcon.js +1 -1
  501. package/dist/icons/LockFilledIcon.js +1 -1
  502. package/dist/icons/LockIcon.js +1 -1
  503. package/dist/icons/MoreIcon.js +1 -1
  504. package/dist/icons/NotAllowedIcon.js +1 -1
  505. package/dist/icons/Number123Icon.js +1 -1
  506. package/dist/icons/NumberIcon.js +1 -1
  507. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  508. package/dist/icons/PauseCircleIcon.js +1 -1
  509. package/dist/icons/PauseIcon.js +1 -1
  510. package/dist/icons/PercentageIcon.js +1 -1
  511. package/dist/icons/PieChartIcon.js +1 -1
  512. package/dist/icons/PipetteIcon.js +1 -1
  513. package/dist/icons/PlayCircleIcon.js +1 -1
  514. package/dist/icons/PlayIcon.js +1 -1
  515. package/dist/icons/PlusIcon.js +1 -1
  516. package/dist/icons/ProgressBarIcon.js +1 -1
  517. package/dist/icons/ReloadIcon.js +1 -1
  518. package/dist/icons/ReportIcon.js +1 -1
  519. package/dist/icons/ReturnIcon.js +1 -1
  520. package/dist/icons/RightIcon.js +1 -1
  521. package/dist/icons/RowTotalsIcon.js +1 -1
  522. package/dist/icons/SchemeIcon.js +1 -1
  523. package/dist/icons/SearchIcon.js +1 -1
  524. package/dist/icons/SemanticQueryIcon.js +1 -1
  525. package/dist/icons/SettingsIcon.js +1 -1
  526. package/dist/icons/ShieldFilledIcon.js +1 -1
  527. package/dist/icons/ShieldIcon.js +1 -1
  528. package/dist/icons/SlashIcon.js +1 -1
  529. package/dist/icons/SparklesIcon.js +1 -1
  530. package/dist/icons/SqlIcon.js +1 -1
  531. package/dist/icons/StatsIcon.js +1 -1
  532. package/dist/icons/StopIcon.js +1 -1
  533. package/dist/icons/StringIcon.js +1 -1
  534. package/dist/icons/SubtotalsIcon.js +1 -1
  535. package/dist/icons/SwitchIcon.js +1 -1
  536. package/dist/icons/TableIcon.js +1 -1
  537. package/dist/icons/ThumbsDownIcon.js +1 -1
  538. package/dist/icons/ThumbsUpIcon.js +1 -1
  539. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  540. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  541. package/dist/icons/ThunderboltIcon.js +1 -1
  542. package/dist/icons/TimeIcon.js +1 -1
  543. package/dist/icons/TrashIcon.js +1 -1
  544. package/dist/icons/UnlockIcon.js +1 -1
  545. package/dist/icons/UpIcon.js +1 -1
  546. package/dist/icons/UserGroupIcon.js +1 -1
  547. package/dist/icons/UserIcon.js +1 -1
  548. package/dist/icons/UserLockIcon.js +1 -1
  549. package/dist/icons/ViewIcon.js +1 -1
  550. package/dist/icons/WarningFilledIcon.js +1 -1
  551. package/dist/icons/WarningIcon.js +1 -1
  552. package/dist/icons/wrap-icon.js +1 -1
  553. package/dist/index.js +1 -1
  554. package/dist/probe/canonicalize.js +1 -1
  555. package/dist/probe/css.js +1 -1
  556. package/dist/probe/index.js +1 -1
  557. package/dist/provider.js +1 -1
  558. package/dist/providers/TrackingProvider.js +1 -1
  559. package/dist/providers/navigation-url.js +1 -1
  560. package/dist/providers/navigationAdapter.default.js +1 -1
  561. package/dist/providers/use-navigation.js +1 -1
  562. package/dist/tokens/all-tokens.js +1 -1
  563. package/dist/tokens/base.js +1 -1
  564. package/dist/tokens/color-seed.js +1 -1
  565. package/dist/tokens/color-theme.js +1 -1
  566. package/dist/tokens/colors.js +1 -1
  567. package/dist/tokens/layout.js +1 -1
  568. package/dist/tokens/lazy-styles.js +1 -1
  569. package/dist/tokens/legacy-color.js +1 -1
  570. package/dist/tokens/palette-config.js +1 -1
  571. package/dist/tokens/palette.js +1 -1
  572. package/dist/tokens/resolve.js +1 -1
  573. package/dist/tokens/shadows.js +1 -1
  574. package/dist/tokens/sizes.js +1 -1
  575. package/dist/tokens/spacing.js +1 -1
  576. package/dist/tokens/typography.js +1 -1
  577. package/dist/utils/ResizeSensor.js +1 -1
  578. package/dist/utils/colors.js +1 -1
  579. package/dist/utils/dotize.js +1 -1
  580. package/dist/utils/is-dev-env.js +1 -1
  581. package/dist/utils/modules.js +1 -1
  582. package/dist/utils/promise.js +1 -1
  583. package/dist/utils/raf.js +1 -1
  584. package/dist/utils/random.js +1 -1
  585. package/dist/utils/range.js +1 -1
  586. package/dist/utils/react/RenderCache.js +1 -1
  587. package/dist/utils/react/Slots.js +1 -1
  588. package/dist/utils/react/chain.js +1 -1
  589. package/dist/utils/react/disabledProps.js +1 -1
  590. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  591. package/dist/utils/react/index.js +1 -1
  592. package/dist/utils/react/interactions.js +1 -1
  593. package/dist/utils/react/isTextOnly.js +1 -1
  594. package/dist/utils/react/mapProps.js +1 -1
  595. package/dist/utils/react/mergeProps.js +1 -1
  596. package/dist/utils/react/nullableValue.js +1 -1
  597. package/dist/utils/react/overlayKeyPropagation.js +1 -1
  598. package/dist/utils/react/programmaticFocus.js +1 -1
  599. package/dist/utils/react/resolveIcon.js +1 -1
  600. package/dist/utils/react/sharedStore.js +1 -1
  601. package/dist/utils/react/useBufferedValue.js +1 -1
  602. package/dist/utils/react/useCombinedRefs.js +1 -1
  603. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  604. package/dist/utils/react/useEventBus.js +1 -1
  605. package/dist/utils/react/useId.js +1 -1
  606. package/dist/utils/react/useIsDarwin.js +1 -1
  607. package/dist/utils/react/useKeySymbols.js +1 -1
  608. package/dist/utils/react/useLayoutEffect.js +1 -1
  609. package/dist/utils/react/useLocalStorage.js +1 -1
  610. package/dist/utils/react/useMergeStyles.js +1 -1
  611. package/dist/utils/react/useOverlayEscapeGuard.js +1 -1
  612. package/dist/utils/react/usePopoverSync.js +1 -1
  613. package/dist/utils/react/useQaProps.js +1 -1
  614. package/dist/utils/react/useScheme.js +7 -5
  615. package/dist/utils/react/useScheme.js.map +1 -1
  616. package/dist/utils/react/useViewportSize.js +1 -1
  617. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  618. package/dist/utils/selection.js +1 -1
  619. package/dist/utils/styles.js +1 -1
  620. package/dist/utils/tree.js +1 -1
  621. package/dist/utils/warnings.js +1 -1
  622. package/dist/version.js +3 -3
  623. package/docs/Theming.md +1 -1
  624. package/docs/Usage.md +26 -0
  625. package/docs/components/content/Item.md +1 -1
  626. package/docs/components/content/TextItem.md +13 -1
  627. package/docs/components/data/ItemTable.md +1 -1
  628. package/docs/components/fields/RadioGroup.md +5 -4
  629. package/docs/components/form/Form.md +2 -0
  630. package/docs/components/form/ModernForm.md +5 -1
  631. package/docs/components/navigation/Tabs.md +5 -3
  632. package/docs/components/overlays/DialogContainer.md +1 -1
  633. package/docs/components/overlays/DialogTrigger.md +2 -2
  634. package/docs/components/overlays/Notifications.md +17 -0
  635. package/docs/components/overlays/Toast.md +1 -1
  636. package/docs/modern-form-guide.md +5 -1
  637. package/docs/tasty/ai-agents.md +3 -2
  638. package/docs/tasty/dsl.md +52 -0
  639. package/docs/tasty/styles.md +27 -15
  640. package/package.json +5 -3
  641. package/tasty.config.generated.ts +526 -0
  642. package/tasty.config.ts +29 -422
@@ -20,7 +20,7 @@ TextItem renders one line truncated with an ellipsis, so Text's `ellipsis` and `
20
20
  - **`highlight`** `string` — String to highlight within children (only works when children is a plain string)
21
21
  - **`highlightCaseSensitive`** `boolean` (default: `false`) — Whether highlight matching is case-sensitive
22
22
  - **`highlightStyles`** `Styles` — Custom styles for highlighted text portions
23
- - **`tooltip`** `string | boolean | TooltipProviderProps` (default: `true`) — Tooltip configuration. `true` enables auto tooltip on overflow, a string shows fixed tooltip text, an object supports advanced configuration.
23
+ - **`tooltip`** `string | boolean | TooltipProviderProps` (default: `true`) — Tooltip configuration. `true` enables auto tooltip on overflow for string children, a string shows fixed tooltip text, an object supports advanced configuration. `{ title, auto: true }` shows `title` only on overflow, for any children (see [Overflow Tooltip for an Element Label](#overflow-tooltip-for-an-element-label)).
24
24
  - **`tooltipPlacement`** `Placement` (default: `top`) — Default tooltip placement
25
25
  - **`monospace`** `boolean` — Use monospace font
26
26
  - **`italic`** `string` — Font style (e.g. `'italic'`)
@@ -66,6 +66,18 @@ When text overflows its container, hovering reveals a tooltip with the full cont
66
66
  </Block>
67
67
  ```
68
68
 
69
+ ### Overflow Tooltip for an Element Label
70
+
71
+ The automatic tooltip shows the text that is cut off, so it needs string children. When the label is built from elements, such as a commit hash coloured apart from its message, give the tooltip its own `title` with `auto: true`. It then shows only while the label is cut off:
72
+
73
+ ```jsx
74
+ <TextItem tooltip={{ title: `${hash}: ${message}`, auto: true }}>
75
+ <Text color="#dark">{hash}:</Text> {message}
76
+ </TextItem>
77
+ ```
78
+
79
+ Only the label's own box is measured. A child that clips its own text, such as a nested `Text` with its own `ellipsis`, never makes the label overflow, so it shows no tooltip. The check reruns when the label resizes or the `title` text changes, so derive a string `title` from the same text as the label.
80
+
69
81
  ### Text Highlighting
70
82
 
71
83
  Highlight matching text within the content - useful for search results:
@@ -215,7 +215,7 @@ const Compact = tasty(ItemTable, {
215
215
  });
216
216
  ```
217
217
 
218
- Rows publish their paint as inherited custom properties — `#row-base`, `#row-overlay`, `$row-overlay-weight`, `#row-text` and `$dim` — which cells consume. `#row-overlay` is an opaque color that cells mix into `#row-base` at `$row-overlay-weight` (a percentage), so each cell paints one solid background color. That is what lets a pinned (and therefore opaque) cell match its row's state without duplicating the state matrix.
218
+ Rows publish their paint as inherited custom properties — `#row-base`, `#row-overlay`, `$row-overlay-weight`, `#row-text` and `$dim` — which cells consume. `#row-overlay` is an opaque color that cells layer over `#row-base` at `$row-overlay-weight`, a number from 0 to 1 read as its opacity (`#row-base+#row-overlay.$row-overlay-weight`), so each cell paints one solid background color. That is what lets a pinned (and therefore opaque) cell match its row's state without duplicating the state matrix.
219
219
 
220
220
  Geometry runs through tokens too: `$row-height`, `$header-height`, `$cell-padding-x` (16px) and `$cell-padding-y`. Height lives on the **cells**, not the `<tr>` — table layout ignores `min-height` on a row and sizes it from its cells instead.
221
221
 
@@ -100,6 +100,7 @@ The `mods` property accepts the following modifiers you can override:
100
100
 
101
101
  - **`horizontal`** `boolean` — Whether the radio group is oriented horizontally
102
102
  - **`tabs`** `boolean` — Whether the radio group uses tabs styling
103
+ - **`segmented`** `boolean` — Set with `tabs`: the segmented control look, shared with `Tabs type="radio"`, applies to it. Each `Radio` in the group carries it too
103
104
  - **`inside-form`** `boolean` — Whether the radio group is inside a form field
104
105
  - **`side-label`** `boolean` — Whether the label is positioned at the side
105
106
  - **`fill-width`** `boolean` — Set when the group's style props size its field's width (`width`, `inlineSize`, `flex*`); the group then fills it
@@ -112,7 +113,7 @@ Each `Radio` carries **`readonly`** while its group is `isReadOnly`. A classic r
112
113
 
113
114
  - `radio` - Traditional radio button appearance (default)
114
115
  - `button` - Button-style radio options with spacing
115
- - `tabs` - Connected tab-style buttons (compact, clear styling)
116
+ - `tabs` - A segmented control. It takes the look of [Tabs](../navigation/Tabs.md) `type="radio"` from one shared style definition: the track, the white chip on the selected option, hover, the keyboard focus ring on the focused option, the disabled look (the selected chip stays, the labels fade) and the text size. Recolor it through the tokens [Tabs → Theming](../navigation/Tabs.md#theming) lists. An invalid or valid group also tints its idle labels. Only the layout differs: its options size to their labels, while tabs share the track equally.
116
117
 
117
118
  **Default Orientation:**
118
119
 
@@ -141,10 +142,10 @@ Controls the size of all radio buttons in the group:
141
142
 
142
143
  **Size Mapping in Tabs Mode:** When `type="tabs"`, sizes are automatically mapped to maintain visual consistency:
143
144
 
144
- - `large` → `medium`
145
- - every other size → `xsmall`
145
+ - `large` → `medium` (a 40px control, t3m text)
146
+ - every other size → `xsmall` (a 32px control, t4 text)
146
147
 
147
- Only `large` is carried through; `xsmall`, `small`, `medium` and `xlarge` all collapse to `xsmall`. This ensures tab groups remain compact and cohesive.
148
+ Only `large` is carried through; `xsmall`, `small`, `medium` and `xlarge` all collapse to `xsmall`. These are the sizes `Tabs type="radio"` uses, so the two controls match at either size.
148
149
 
149
150
  ### Button Type
150
151
 
@@ -158,6 +158,8 @@ A thrown/rejected save error appears through `Form.SubmitError`. Validation erro
158
158
 
159
159
  A `Form` placed directly in a `Dialog`, wrapping its `Content` and `Footer`, lays itself out as the dialog's slot column: a flex column that grows into the dialog, lets `Content` scroll, and adds no space between the slots. That is the form's own `@in-dialog` state, so `styles` on the form still override it property by property. You can also name the state to change only the in-dialog case: `<Form styles={{ gap: { '': '2x', '@in-dialog': '1x' } }}>`. A form nested inside `Content` is an ordinary form.
160
160
 
161
+ A modern `Form` anywhere in a dialog reports the user's unsaved edits to the dialog's `DialogTrigger` or `DialogContainer`, as `DialogForm` does, so Escape, a click outside and the close button ask "Discard changes?" first. A value set from code is not an edit, and a successful submit saves what it carried. Set `confirmDismiss={false}` on the trigger or container where backing out loses nothing. See [Unsaved edits](../overlays/DialogTrigger.md#unsaved-edits).
162
+
161
163
  ## React Compiler
162
164
 
163
165
  The modern controller, subscriptions, input binding, and dialog workflows are tested with React Compiler on React 19.3. The published library is compiled using React’s native compiler runtime; consumers do not need to enable Compiler. Consumer render code must use `Form.useValue`, `Form.useFieldState`, or selectors to subscribe; imperative getters do not subscribe. This does not make legacy mutable instance reads Compiler-safe.
@@ -287,4 +287,8 @@ function EditProfileDialog({ initialProfile, save }) {
287
287
  }
288
288
  ```
289
289
 
290
- The dialog closes only after successful submission, including `form.submit()` and controller-configured callbacks. Validation or save errors keep it open. Closing cancels pending submission; late responses cannot close a reopened session. By default, ending the session resets values. Use `preserve` to retain the draft in a controller owned outside the dialog. `preserve` does not keep an unmounted controller alive. See the [DialogForm reference](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogform--docs) for custom actions, container lifecycle, and legacy behavior.
290
+ The dialog closes only after successful submission, including `form.submit()` and controller-configured callbacks. Validation or save errors keep it open. Closing cancels pending submission; late responses cannot close a reopened session. By default, ending the session resets values. Use `preserve` to retain the draft in a controller owned outside the dialog. `preserve` does not keep an unmounted controller alive.
291
+
292
+ While a field the user edited differs from its default, Escape, a click outside and the close button ask "Discard changes?" first. That holds for a `<Form>` you place in a `Dialog` yourself too: the root reports its edits to the `DialogTrigger` or `DialogContainer` that owns the dialog, with no wiring. A value set from code is not an edit, and a successful submit saves what it carried, so a dialog that stays open after saving (to show a created key, say) closes at once until the user types again. Set `confirmDismiss={false}` on the trigger or container when backing out loses nothing. See [Unsaved edits](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogtrigger--docs#unsaved-edits).
293
+
294
+ See the [DialogForm reference](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogform--docs) for custom actions, container lifecycle, and legacy behavior.
@@ -85,6 +85,7 @@ These properties allow direct style application without using the `styles` prop:
85
85
  The `mods` property accepts the following modifiers:
86
86
 
87
87
  - **`type`** `'default' \| 'narrow' \| 'file' \| 'radio'` — Current tab type
88
+ - **`segmented`** `boolean` — True for the `radio` type, the segmented control it shares with `Radio.Tabs`
88
89
  - **`placement`** `'top' \| 'bottom' \| 'left' \| 'right'` — Current bar placement
89
90
  - **`deletable`** `boolean` — True when onDelete callback is provided
90
91
  - **`scrolling`** `boolean` — True when tabs are being scrolled
@@ -95,6 +96,7 @@ The `mods` property accepts the following modifiers:
95
96
  For individual tabs:
96
97
 
97
98
  - **`type`** `'default' \| 'narrow' \| 'file' \| 'radio'` — Current tab type
99
+ - **`segmented`** `boolean` — True for a `radio` tab, a segment of the shared segmented control
98
100
  - **`active`** `boolean` — True when the tab is selected
99
101
  - **`deletable`** `boolean` — True when delete button is visible
100
102
  - **`disabled`** `boolean` — True when tab is disabled
@@ -159,16 +161,16 @@ A navigation strip with no panels, themed with your own tokens:
159
161
  - `default` - Standard tabs with selection indicator below (default)
160
162
  - `narrow` - Same as default but with collapsed horizontal label padding for compact layouts
161
163
  - `file` - File-style tabs with border bottom highlight on selection, delimiter between tabs
162
- - `radio` - Radio button style for tab selection. This is the right choice for a compact switcher that is _not_ a form field — a view toolbar, a segmented control over page content. [`Radio.Tabs`](../fields/RadioGroup.md) looks the same but is a form control, so keep it for choices inside a `Form`
164
+ - `radio` - Radio button style for tab selection. This is the right choice for a compact switcher that is _not_ a form field — a view toolbar, a segmented control over page content. [`Radio.Tabs`](../fields/RadioGroup.md) takes the same segmented look from one shared style definition (only the layout differs: its options size to their labels, while tabs share the track equally), but it is a form control, so keep it for choices inside a `Form`
163
165
 
164
166
  ### Sizes
165
167
 
166
168
  - `xsmall` - Extra small size with t4 typography
167
- - `small` - Small size with t3m typography (default)
169
+ - `small` - Small size with t3m typography
168
170
  - `medium` - Default size with t3m typography
169
171
  - `large` - Larger tabs with t3m typography
170
172
 
171
- **Note:** Radio type supports `large` (default, 40px total) and `medium` (32px total) sizes, mapped to Item button sizes `medium` (32px) and `xsmall` (24px) respectively. A radio tab given less room than its title (an explicit `width`, say) truncates the title and shows it in a tooltip.
173
+ **Note:** Radio type supports `medium` (default, 32px total) and `large` (40px total) sizes, mapped to Item button sizes `xsmall` (24px, t4 text) and `medium` (32px, t3m text) respectively. `Radio.Tabs` maps its sizes the same way. A radio tab given less room than its title (an explicit `width`, say) truncates the title and shows it in a tooltip.
172
174
 
173
175
  ### Placement / Vertical Tabs
174
176
 
@@ -21,7 +21,7 @@ A DialogContainer accepts a single Dialog as a child, and manages to show and hi
21
21
  - **`styles`** `Styles` — Styles for the overlay content shell
22
22
  - **`isDismissable`** `boolean` (default: `true`) — Whether the Dialog is dismissible
23
23
  - **`isKeyboardDismissDisabled`** `boolean` (default: `false`) — Whether pressing the escape key to close the dialog should be disabled
24
- - **`confirmDismiss`** `boolean` — Whether Escape, an outside click and the close button ask "Discard changes?" before they call `onDismiss`. Unset, they ask while a `DialogForm` inside has unsaved edits; `true` always asks, `false` never does. Closing it from code (`isOpen`, removing the child) never asks. See [Unsaved edits](./DialogTrigger.md#unsaved-edits)
24
+ - **`confirmDismiss`** `boolean` — Whether Escape, an outside click and the close button ask "Discard changes?" before they call `onDismiss`. Unset, they ask while a form inside (a `DialogForm`, or a modern `Form`) has unsaved edits; `true` always asks, `false` never does. Closing it from code (`isOpen`, removing the child) never asks. See [Unsaved edits](./DialogTrigger.md#unsaved-edits)
25
25
  - **`isOpen`** `boolean` — Whether the modal is open or not
26
26
  - **`onDismiss`** `function` — Handler called when the x button of a dismissible Dialog is clicked
27
27
  - **`hideOnClose`** `boolean` (default: `false`) — Whether the dialog should be hidden when closed. Focus moves as for a dialog that mounts on open: in on every open, and on close back to the element that opened it, or to the trigger of the menu or popover it sat in once that has closed. [Focus with `hideOnClose`](#focus-with-hideonclose) lists what still differs
@@ -23,7 +23,7 @@ DialogTrigger serves as a wrapper around a Dialog and its associated trigger, li
23
23
  - **`mobileViewport`** `number` (default: `700`) — The screen breakpoint for the mobile type
24
24
  - **`isDismissable`** `boolean` (default: `true`) — Whether passive dismissal (Escape or an outside click) can close the dialog. Explicit dialog actions, such as Submit and Cancel, can still close it. A popover that is not dismissable leaves outside presses alone: the control pressed still receives the press, and a text field there can take focus, because such a popover does not hold focus. It stays open when another popover opens, and closes when a modal, tray, fullscreen or panel dialog opens from another `DialogTrigger`.
25
25
  - **`isKeyboardDismissDisabled`** `boolean` (default: `false`) — Whether pressing the escape key to close the dialog should be disabled
26
- - **`confirmDismiss`** `boolean` — Whether Escape, an outside click and the close button ask "Discard changes?" before they close the dialog. Unset, they ask while a `DialogForm` inside has unsaved edits; `true` always asks, `false` never does. Explicit actions (Submit, Cancel, the `close` function) never ask, and neither does a popover. See [Unsaved edits](#unsaved-edits)
26
+ - **`confirmDismiss`** `boolean` — Whether Escape, an outside click and the close button ask "Discard changes?" before they close the dialog. Unset, they ask while a form inside (a `DialogForm`, or a modern `Form`) has unsaved edits; `true` always asks, `false` never does. Explicit actions (Submit, Cancel, the `close` function) never ask, and neither does a popover. See [Unsaved edits](#unsaved-edits)
27
27
  - **`isOpen`** `boolean` — Whether the dialog is open (controlled)
28
28
  - **`defaultOpen`** `boolean` (default: `false`) — Whether the dialog is open by default (uncontrolled)
29
29
  - **`offset`** `number` (default: `8`) — The gap between the trigger and a popover, along the main axis. `0` places the popover flush against the trigger
@@ -133,7 +133,7 @@ These properties allow direct style application without using the `styles` prop:
133
133
 
134
134
  A dialog that holds unsaved edits asks before a passive dismissal discards them: Escape from any control, a click outside the dialog, or its close button opens a "Discard changes?" confirmation instead of closing. **Discard** closes the dialog and calls `onDismiss`; **Keep editing**, Escape or a click outside the confirmation returns to the dialog with its edits and focus where they were.
135
135
 
136
- A `DialogForm` turns this on while a field the user edited differs from its default, so a form dialog needs no wiring; a value set from code doesn't count. For any other dialog, bind `confirmDismiss` to its own state:
136
+ A form inside turns this on while a field the user edited differs from its default, so a form dialog needs no wiring: a `DialogForm`, or a modern `Form` in a dialog you lay out yourself. A value set from code doesn't count, and a successful submit saves the edits it carried, so a dialog that stays open after saving closes at once until the user types again. The dialog asks while any of its forms has unsaved edits. For any other dialog, bind `confirmDismiss` to its own state:
137
137
 
138
138
  ```jsx
139
139
  <DialogTrigger confirmDismiss={notes !== savedNotes}>
@@ -279,6 +279,23 @@ const { total, unread } = useNotificationsCount();
279
279
 
280
280
  Maximum 5 notifications are visible at once. When a new notification arrives and the cap is reached, the oldest notification is evicted (dismissed) to make room. This ensures the most recent notifications are always visible. Evicted persistent notifications are moved to the persistent list.
281
281
 
282
+ ## Positioning
283
+
284
+ Toasts and notifications share one stack, fixed at the top center of the viewport, 16px below the top edge. An app with its own fixed bar at the top can push the stack below it with the `$overlay-inset-top` custom property (`--overlay-inset-top`, default `0px`), added to those 16px. Set it from the component that renders the bar, for as long as the bar is shown:
285
+
286
+ ```tsx
287
+ import { useGlobalStyles } from '@cube-dev/ui-kit';
288
+
289
+ function TopBar() {
290
+ // The bar is 6x tall, plus its 1bw bottom border.
291
+ useGlobalStyles(':root', { '$overlay-inset-top': '(6x + 1bw)' });
292
+
293
+ return <BarElement>…</BarElement>;
294
+ }
295
+ ```
296
+
297
+ A collapsed toast stack still slides up to the viewport's top edge, so the 10px strip it leaves sits over the bar, which stays clickable through it.
298
+
282
299
  ## Duration Defaults
283
300
 
284
301
  - **Non-persistent overlay** — 3000ms
@@ -234,7 +234,7 @@ Maximum 3 toasts are visible at once. When the limit is exceeded, the oldest toa
234
234
 
235
235
  ### Positioning
236
236
  - Fixed at top center of the viewport
237
- - 16px from the top edge
237
+ - 16px from the top edge, plus `$overlay-inset-top` when the app sets it (see [Notification → Positioning](./Notifications.md#positioning))
238
238
  - Toasts stack vertically (newest at bottom)
239
239
 
240
240
  ### Collapse on Hover
@@ -287,4 +287,8 @@ function EditProfileDialog({ initialProfile, save }) {
287
287
  }
288
288
  ```
289
289
 
290
- The dialog closes only after successful submission, including `form.submit()` and controller-configured callbacks. Validation or save errors keep it open. Closing cancels pending submission; late responses cannot close a reopened session. By default, ending the session resets values. Use `preserve` to retain the draft in a controller owned outside the dialog. `preserve` does not keep an unmounted controller alive. See the [DialogForm reference](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogform--docs) for custom actions, container lifecycle, and legacy behavior.
290
+ The dialog closes only after successful submission, including `form.submit()` and controller-configured callbacks. Validation or save errors keep it open. Closing cancels pending submission; late responses cannot close a reopened session. By default, ending the session resets values. Use `preserve` to retain the draft in a controller owned outside the dialog. `preserve` does not keep an unmounted controller alive.
291
+
292
+ While a field the user edited differs from its default, Escape, a click outside and the close button ask "Discard changes?" first. That holds for a `<Form>` you place in a `Dialog` yourself too: the root reports its edits to the `DialogTrigger` or `DialogContainer` that owns the dialog, with no wiring. A value set from code is not an edit, and a successful submit saves what it carried, so a dialog that stays open after saving (to show a created key, say) closes at once until the user types again. Set `confirmDismiss={false}` on the trigger or container when backing out loses nothing. See [Unsaved edits](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogtrigger--docs#unsaved-edits).
293
+
294
+ See the [DialogForm reference](https://cube-ui-kit.vercel.app/?path=/docs/overlays-dialogform--docs) for custom actions, container lifecycle, and legacy behavior.
@@ -10,7 +10,7 @@ Notation: ❌ wrong → ✅ correct.
10
10
 
11
11
  Color tokens (`#name`), custom properties (`$name`), `preset` names, `recipe` names, state aliases (`@mobile`) and extra units are **project-defined** in `tasty.config.ts` or a `configure({ … })` call. Look them up before writing styles. Never invent a name — reuse an existing one, or add it to the config.
12
12
 
13
- Only Tasty's built-ins exist without config: `#white`, `#black`, `#border`, `#outline`, `#current`, `#clear`, and `$gap`, `$radius`, `$border-width`, `$outline-width`, `$transition`, `$sharp-radius`, `$bold-font-weight`, `$font-sans-fallback`, `$font-mono-fallback`.
13
+ Only Tasty's built-ins exist without config: `#white`, `#black`, `#border`, `#outline`, `#current`, `#clear`, and `$gap`, `$radius`, `$border-width`, `$outline-width`, `$transition`, `$sharp-radius`, `$bold-font-weight`, `$icon-size` (only where a `preset` applies), `$font-sans-fallback`, `$font-mono-fallback`.
14
14
 
15
15
  ## 1. Where styles go
16
16
 
@@ -72,6 +72,7 @@ The last row goes the other way — longhands over the shorthand — because `fl
72
72
  | `#name.50` | token at 50% opacity — digits are a decimal fraction: `.5` = `.50` = 50%, `.05` = 5%, `.100` = 10% |
73
73
  | `#name.$opacity` | opacity from a custom property |
74
74
  | `#clear` / `#current` | `transparent` / `currentcolor` |
75
+ | `#a+#b.04` | `#b` at 4% opacity over `#a`, as one color; layers stack left to right (`#a+#b.1+#c.04`) |
75
76
  | `$name` | custom property → `var(--name)` |
76
77
  | `(#a, #b)` | fallback chain |
77
78
  | `$$name` / `##name` | the custom property _name_ (not its value) — inside `transition` |
@@ -134,7 +135,7 @@ Directional modifiers beat placeholder zeros:
134
135
  - ❌ `padding: '2x 4x top right'` — a directional group takes one value, so `4x` is dropped → ✅ `padding: '2x top, 4x right'`
135
136
  - ❌ `fade: '3x 1x top bottom'` → ✅ `fade: '3x top, 1x bottom'`
136
137
 
137
- Value-only properties reject both colors and modifiers: `gap`, `columnGap`, `rowGap`, `opacity`, `zIndex`, `order`, `flexGrow`, `flexShrink`, `flexBasis`, `aspectRatio`, `lineClamp`, and `tabSize`. Logical axis category styles accept one or two values in start/end order and the `start`, `end`, and `longhand` modifiers. `fill`, `color`, `caretColor`, and `accentColor` take a color only (use `#clear` for transparent). `fill` also mixes two colors with a comma, the weight as a percentage: ❌ `fill: '#surface #dark.04'` (deprecated overlay layer) · ❌ `fill: '#dark.04, #surface'` (half-transparent mix) → ✅ `fill: '#dark 4%, #surface'`.
138
+ Value-only properties reject both colors and modifiers: `gap`, `columnGap`, `rowGap`, `opacity`, `zIndex`, `order`, `flexGrow`, `flexShrink`, `flexBasis`, `aspectRatio`, `lineClamp`, and `tabSize`. Logical axis category styles accept one or two values in start/end order and the `start`, `end`, and `longhand` modifiers. `fill`, `color`, `caretColor`, and `accentColor` take a color only (use `#clear` for transparent). An overlay is a compound color, in any color slot: ❌ `fill: '#surface #dark.04'` (deprecated overlay layer) · ❌ `fill: '#dark.04, #surface'` (half-transparent mix) → ✅ `fill: '#surface+#dark.04'`. Write it as one word, with no spaces around `+`. Every layer after the first needs an opacity suffix, and its token must be opaque: a translucent layer token, or one that is `#clear` in some state, leaves the result see-through, so vary the suffix (`#surface+#dark.$hover`) or the whole compound per state instead. A comma mix in `fill` is deprecated too: ❌ `fill: '#dark 4%, #surface'` → ✅ `fill: '#surface+#dark.04'`. For any other mix, write `color-mix()` itself: ✅ `fill: 'color-mix(in srgb, #dark $weight, #surface)'`.
138
139
 
139
140
  ### `transition`
140
141
 
package/docs/tasty/dsl.md CHANGED
@@ -168,6 +168,7 @@ color: '#purple.5', // 50% opacity
168
168
  color: '#purple.05', // 5% opacity
169
169
  color: '#purple.$fade', // Opacity from a custom property
170
170
  fill: '#current', // → currentcolor
171
+ fill: '#surface+#dark.04', // #dark at 4% opacity over #surface, as one color
171
172
  color: '(#primary, #secondary)', // Fallback syntax
172
173
  ```
173
174
 
@@ -255,6 +256,57 @@ clamped, and rectangular, so there is no hue to interpolate against
255
256
  `transparent`. Nothing configures it — see
256
257
  [Color space](configuration.md#color-space).
257
258
 
259
+ ### Compound colors
260
+
261
+ Join color tokens with `+` to paint each one, at its own opacity, over the
262
+ colors before it. The result is one color, so it works anywhere a token does:
263
+
264
+ ```jsx
265
+ fill: '#surface+#dark.04',
266
+ // → color-mix(in srgb, var(--dark-color) 4%, var(--surface-color))
267
+
268
+ border: '1bw #border+#dark.1',
269
+ color: 'light-dark(#primary+#black.2, #primary+#white.2)',
270
+ '#hover-surface': '#surface-2+#surface-text.03',
271
+ ```
272
+
273
+ Read it left to right, bottom layer first: `#surface+#accent.1+#dark.04` paints
274
+ `#accent` at 10% over `#surface`, then `#dark` at 4% over that. Every operand is
275
+ an ordinary token — `#current`, `#clear`, a hex color, a replace token — and
276
+ takes its opacity suffix as it does anywhere: `#surface+#dark.$hover` reads the
277
+ opacity from `$hover`, and a faded base such as `#surface.5+#dark.04` is layered
278
+ as it is.
279
+
280
+ The layers mix in sRGB, the space browsers composite in, so the color is exactly
281
+ what stacking them as layers would show — but it is one color, which contrast
282
+ checkers can read and transitions interpolate. A faded base is exact too:
283
+ `#surface.5+#dark.04` is as translucent as the two layers would be.
284
+
285
+ Every layer's token has to be opaque. The mix counts a layer's own alpha as well
286
+ as its opacity suffix, and lowers the alpha of the whole color, so a layer token
287
+ that holds a translucent color, or turns transparent in some state, leaves the
288
+ result see-through: with `'#overlay': { '': '#clear', hovered: '#dark' }`,
289
+ `'#surface+#overlay.04'` is 96% opaque at rest. Vary the opacity instead
290
+ (`'#surface+#dark.$hover'`), or give each state its own color
291
+ (`fill: { '': '#surface', hovered: '#surface+#dark.04' }`).
292
+
293
+ - Write it as one word: `#surface + #dark.04` is three separate values, and
294
+ Tasty warns in development.
295
+ - A layer without an opacity covers everything before it: `#surface+#dark` is
296
+ `#dark`, with a development warning.
297
+ - A layer Tasty can see is transparent — `#clear`, a fade to `.0`, a color with
298
+ a zero alpha — is left out: `#surface+#clear` is `#surface`.
299
+ - Over a transparent base, a layer is just its fade: `#clear+#dark.04` compiles
300
+ to `#dark.04`.
301
+ - A `+` joining anything but color tokens (`#surface+1x`) is not a compound: the
302
+ token is dropped, with a development warning, and the style renders as if
303
+ that color were not there.
304
+
305
+ A `+` joins tokens only. To fade a whole compound, give it a token
306
+ (`'#hover-surface': '#surface+#dark.04'`) and fade that (`#hover-surface.5`). For
307
+ a mix that is not a layer over another color, such as an even blend in OKLCH,
308
+ write `color-mix()` itself.
309
+
258
310
  ---
259
311
 
260
312
  ## CSS Color Functions
@@ -303,52 +303,64 @@ Avoid setting physical and logical declarations that resolve to the same edge in
303
303
 
304
304
  Background color with design token support. Preferred over `backgroundColor` and `background`.
305
305
 
306
- **Syntax:** `[color]`, or two colors mixed with a comma: `[color] [weight%], [color]`
306
+ **Syntax:** `[color]`
307
307
 
308
308
  | Value | Effect |
309
309
  |-------|--------|
310
310
  | `"#purple"` | Token-based background color |
311
311
  | `"#purple.10"` | Token color at 10% opacity |
312
- | `"#dark 4%, #surface"` | `#dark` mixed into `#surface` at 4% — the color `#dark` at 4% opacity over `#surface` would show |
312
+ | `"#surface+#dark.04"` | `#dark` at 4% opacity over `#surface`, as one color — see [Compound colors](dsl.md#compound-colors) |
313
313
  | `"rgb(255 128 0)"` | CSS color value |
314
314
  | `"color-mix(in oklab, #primary 50%, #surface)"` | CSS color function — see [CSS Color Functions](dsl.md#css-color-functions) |
315
315
 
316
- #### Mixing two colors
316
+ #### Overlays
317
317
 
318
- A comma between two colors mixes them into one:
318
+ An overlay over a base color is a [compound color](dsl.md#compound-colors):
319
319
 
320
320
  ```jsx
321
- fill: '#dark 4%, #surface'
322
- // → background-color: color-mix(in srgb, var(--dark-color) 4%, var(--surface-color));
321
+ fill: { '': '#surface', hovered: '#surface+#dark.04', pressed: '#surface+#dark.08' }
322
+ // hovered → background-color: color-mix(in srgb, var(--dark-color) 4%, var(--surface-color));
323
323
  ```
324
324
 
325
- The comma-separated parts are the arguments of `color-mix()`, as written, mixed in sRGB: the space browsers composite layers in. When the weighted color is opaque, the mix is exactly what drawing it at that opacity over the other color shows. And because it is one `background-color`:
325
+ The overlay token has to be opaque, with its opacity in the suffix: a translucent
326
+ token, or one that turns `#clear` in some state, leaves the background
327
+ see-through. Because the result is one `background-color`:
326
328
 
327
329
  - contrast checkers such as axe-core and Lighthouse can read it;
328
330
  - it transitions and animates between states like any other color;
329
331
  - an `image` on the same element stays the only `background-image` layer.
330
332
 
331
- The weight can come from a token or an expression: `'#dark $hover-weight, #surface'`, `'#dark ($hover * 100%), #surface'`.
332
-
333
- Give the weight as a percentage, not as an opacity. A color without a percentage takes half the weight, and its own alpha weighs it down again, so the mix comes out see-through: `'#dark.04, #surface'` is 52% opaque, not `#dark` at 4% over `#surface`. In development Tasty warns about a `#name.N` or `#clear` part without a percentage. It can't see into a token, though, so a token holding a translucent color mixes the same way with no warning: keep the token opaque and put its weight in the percentage.
334
-
335
- A mix takes two colors. Any more are ignored, with a development warning.
336
-
337
333
  #### Two colors separated by a space (deprecated)
338
334
 
339
335
  `fill: '#surface #dark.04'` paints the first color as `background-color` and the second as a `linear-gradient()` layer over it, through the `--tasty-second-fill-color` custom property. It still works, with a development warning, and is going away in the next major version: contrast checkers can't see through a `background-image`, so axe-core reports every text node over the layer as *incomplete*.
340
336
 
337
+ Put a `+` where the space is:
338
+
341
339
  | Before | After |
342
340
  |--------|-------|
343
- | `'#surface #dark.04'` | `'#dark 4%, #surface'` |
341
+ | `'#surface #dark.04'` | `'#surface+#dark.04'` |
344
342
  | `'#surface #clear'` | `'#surface'` |
345
343
  | `'#surface #accent'` (an opaque overlay) | `'#accent'` |
346
- | `'#base #overlay'` (a token holding a translucent color) | `'#overlay $overlay-weight, #base'`, with `#overlay` opaque and `$overlay-weight` a percentage |
344
+ | `'#base #overlay'` (a token holding a translucent color) | `'#base+#overlay.$overlay-alpha'`, with `#overlay` opaque and `$overlay-alpha` its opacity as a number |
347
345
 
348
346
  The rewrites are exact when the overlay token is opaque. A state map no longer needs the same two-color shape in every state to transition smoothly: every state is now a plain background color.
349
347
 
350
348
  If an overlay has to stay a translucent token, draw the layer yourself with `fill: '#base', image: 'linear-gradient(#overlay, #overlay)'`. Contrast checkers can't read that either.
351
349
 
350
+ #### Two colors mixed with a comma (deprecated)
351
+
352
+ `fill: '#dark 4%, #surface'` mixes the two colors in sRGB, as the arguments of `color-mix()`: `color-mix(in srgb, var(--dark-color) 4%, var(--surface-color))`. It still works, with a development warning, and is going away in the next major version. A compound color is the same mix, in every color slot, and `color-mix()` itself covers what a compound can't write. `tasty/prefer-fill-mix` in [`@tenphi/eslint-plugin-tasty`](https://github.com/tenphi/eslint-plugin-tasty) rewrites each mix to the same color.
353
+
354
+ | Before | After |
355
+ |--------|-------|
356
+ | `'#dark 4%, #surface'`, `'#surface, #dark 4%'` | `'#surface+#dark.04'` |
357
+ | `'#accent 10%, #surface+#dark.04'` | `'#surface+#dark.04+#accent.1'` |
358
+ | `'#dark $hover-weight, #surface'` (a percentage) | `'#surface+#dark.$hover-alpha'`, with `$hover-alpha` the opacity as a number — or `'color-mix(in srgb, #dark $hover-weight, #surface)'` |
359
+ | `'#dark, #surface'`, `'rgb(0 0 0) 4%, #surface'`, and any other mix | `'color-mix(in srgb, #dark, #surface)'` — the same parts, in `color-mix()` |
360
+ | `'#dark.04, #surface'` (a translucent part without a percentage) | `'#surface+#dark.04'` |
361
+
362
+ Every rewrite but the last row's is the same color. `'#dark.04, #surface'` mixed a translucent color in by half and came out 52% opaque, so its rewrite paints what it was most likely meant to: `#dark` at 4% over `#surface`.
363
+
352
364
  There is no default fill color, so `fill: true` is ignored with a development warning. Use `false` for no fill.
353
365
 
354
366
  **Related deprecated props:** `backgroundColor` (use `fill`), `background` (overrides all background props when set — avoid).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cube-dev/ui-kit",
3
- "version": "0.204.0",
3
+ "version": "0.206.0",
4
4
  "type": "module",
5
5
  "description": "UIKit for Cube Projects",
6
6
  "repository": {
@@ -34,7 +34,8 @@
34
34
  "docs/tasty",
35
35
  "docs/glaze",
36
36
  "docs/*.md",
37
- "tasty.config.ts"
37
+ "tasty.config.ts",
38
+ "tasty.config.generated.ts"
38
39
  ],
39
40
  "keywords": [
40
41
  "uikit"
@@ -59,7 +60,7 @@
59
60
  "@tabler/icons-react": "^3.31.0",
60
61
  "@tanstack/react-virtual": "^3.13.12",
61
62
  "@tenphi/glaze": "2.0.0",
62
- "@tenphi/tasty": "3.15.0",
63
+ "@tenphi/tasty": "3.17.1",
63
64
  "clipboard-copy": "^4.0.1",
64
65
  "clsx": "^1.1.1",
65
66
  "diff": "^8.0.3",
@@ -198,6 +199,7 @@
198
199
  "add-icons": "cd src/icons && node add-new-icon.js && pnpm fix",
199
200
  "audit-docs": "node scripts/audit-docs.mjs",
200
201
  "audit-defaults": "UPDATE_DEFAULTS=1 vitest run src/eslint-plugin/defaults.test.ts && prettier --write src/eslint-plugin/defaults.generated.ts",
202
+ "generate:tasty-config": "UPDATE_TASTY_CONFIG=1 vitest run src/tokens/tasty-config.test.ts && prettier --write tasty.config.generated.ts",
201
203
  "diagnostics:compiler": "node scripts/compiler/report.mjs",
202
204
  "diagnostics:form": "node scripts/form-diagnostics.mjs",
203
205
  "diagnostics:complexity": "node scripts/complexity-report.mjs",