@cube-dev/ui-kit 0.169.1 → 0.170.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 (588) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +18 -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 +5 -5
  16. package/dist/components/GlobalStyles.js.map +1 -1
  17. package/dist/components/GridProvider.js +1 -1
  18. package/dist/components/HiddenInput.js +1 -1
  19. package/dist/components/Root.js +3 -5
  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 +1 -1
  23. package/dist/components/actions/Banner/Banner.js.map +1 -1
  24. package/dist/components/actions/Button/Button.js +1 -1
  25. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  26. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  27. package/dist/components/actions/ButtonSplit/context.js +1 -1
  28. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  29. package/dist/components/actions/CommandMenu/styled.js +1 -1
  30. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  31. package/dist/components/actions/ItemActionContext.js +1 -1
  32. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  33. package/dist/components/actions/Link/Link.js +1 -1
  34. package/dist/components/actions/Menu/Menu.js +1 -1
  35. package/dist/components/actions/Menu/MenuItem.js +1 -1
  36. package/dist/components/actions/Menu/MenuSection.js +1 -1
  37. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  39. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  40. package/dist/components/actions/Menu/context.js +1 -1
  41. package/dist/components/actions/Menu/styled.js +1 -1
  42. package/dist/components/actions/Menu/styled.js.map +1 -1
  43. package/dist/components/actions/index.js +1 -1
  44. package/dist/components/actions/use-action.js +1 -1
  45. package/dist/components/actions/use-anchored-menu.js +1 -1
  46. package/dist/components/actions/use-context-menu.js +1 -1
  47. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/dist/components/content/Alert/Alert.js +1 -1
  49. package/dist/components/content/Alert/use-alert.js +1 -1
  50. package/dist/components/content/Avatar/Avatar.js +1 -1
  51. package/dist/components/content/Badge/Badge.js +1 -1
  52. package/dist/components/content/Card/Card.js +1 -1
  53. package/dist/components/content/Content.js +1 -1
  54. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  55. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  56. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  57. package/dist/components/content/Divider.js +1 -1
  58. package/dist/components/content/Footer.js +1 -1
  59. package/dist/components/content/Header.js +1 -1
  60. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  61. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  62. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  63. package/dist/components/content/Item/Item.js +1 -1
  64. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  65. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  66. package/dist/components/content/Layout/GridLayout.js +1 -1
  67. package/dist/components/content/Layout/Layout.js +1 -1
  68. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  69. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  70. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  71. package/dist/components/content/Layout/LayoutContent.js +1 -1
  72. package/dist/components/content/Layout/LayoutContext.js +1 -1
  73. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  74. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  75. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  76. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutPane.js +1 -1
  78. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  79. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  80. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  81. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  82. package/dist/components/content/Layout/index.js +1 -1
  83. package/dist/components/content/Layout/utils.js +1 -1
  84. package/dist/components/content/Paragraph.js +1 -1
  85. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  86. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  87. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  88. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  89. package/dist/components/content/Result/Result.js +1 -1
  90. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  91. package/dist/components/content/Tag/Tag.js +1 -1
  92. package/dist/components/content/Text.js +1 -1
  93. package/dist/components/content/TextItem/TextItem.js +1 -1
  94. package/dist/components/content/Title.js +1 -1
  95. package/dist/components/content/Tree/Tree.js +1 -1
  96. package/dist/components/content/Tree/TreeNode.js +1 -1
  97. package/dist/components/content/Tree/styled.js +1 -1
  98. package/dist/components/content/Tree/tree-index.js +1 -1
  99. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  100. package/dist/components/content/Tree/use-load-data.js +1 -1
  101. package/dist/components/content/highlightText.js +1 -1
  102. package/dist/components/content/use-auto-tooltip.js +1 -1
  103. package/dist/components/data/DataTable/DataTable.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  106. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  107. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  108. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  109. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  110. package/dist/components/data/TableBase/RowCollection.js +1 -1
  111. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  112. package/dist/components/data/TableBase/TableRow.js +1 -1
  113. package/dist/components/data/TableBase/TableView.js +1 -1
  114. package/dist/components/data/TableBase/column-menu.js +1 -1
  115. package/dist/components/data/TableBase/column-tint.js +2 -2
  116. package/dist/components/data/TableBase/column-tint.js.map +1 -1
  117. package/dist/components/data/TableBase/row-menu.js +1 -1
  118. package/dist/components/data/TableBase/styled.js +1 -1
  119. package/dist/components/data/TableBase/table-tree.js +1 -1
  120. package/dist/components/data/TableBase/types.d.ts +3 -3
  121. package/dist/components/data/TableBase/types.js +1 -1
  122. package/dist/components/data/TableBase/types.js.map +1 -1
  123. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  124. package/dist/components/data/TableBase/use-column-order.js +1 -1
  125. package/dist/components/data/TableBase/use-container-width.js +1 -1
  126. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  127. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  128. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  129. package/dist/components/data/TableBase/use-table-search.js +1 -1
  130. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  131. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  132. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  133. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  134. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  135. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  136. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  137. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  138. package/dist/components/fields/Checkbox/context.js +1 -1
  139. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  140. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  141. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  142. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +2 -2
  143. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
  144. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  145. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  146. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  147. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  148. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  149. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  150. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  151. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  152. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  153. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  154. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  155. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  156. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  158. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  159. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  160. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  161. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  162. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  163. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  164. package/dist/components/fields/DatePicker/period.js +1 -1
  165. package/dist/components/fields/DatePicker/props.js +1 -1
  166. package/dist/components/fields/DatePicker/utils.js +1 -1
  167. package/dist/components/fields/FileInput/FileInput.js +1 -1
  168. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  169. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  170. package/dist/components/fields/Input/Input.js +1 -1
  171. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  172. package/dist/components/fields/ListBox/ListBox.js +1 -1
  173. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  174. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  175. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  176. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  177. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  178. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  179. package/dist/components/fields/Picker/Picker.js +1 -1
  180. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  181. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  182. package/dist/components/fields/RadioGroup/context.js +1 -1
  183. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  184. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  185. package/dist/components/fields/Select/Select.js +1 -1
  186. package/dist/components/fields/Select/Select.js.map +1 -1
  187. package/dist/components/fields/Slider/Gradation.js +1 -1
  188. package/dist/components/fields/Slider/HueSlider.js +1 -1
  189. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  190. package/dist/components/fields/Slider/Slider.js +1 -1
  191. package/dist/components/fields/Slider/SliderBase.js +1 -1
  192. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  193. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  194. package/dist/components/fields/Slider/elements.js +1 -1
  195. package/dist/components/fields/Slider/index.js +1 -1
  196. package/dist/components/fields/Switch/Switch.js +1 -1
  197. package/dist/components/fields/TextArea/TextArea.js +1 -1
  198. package/dist/components/fields/TextInput/TextInput.js +1 -1
  199. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  200. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  201. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  202. package/dist/components/fields/color/ColorPanel.js +1 -1
  203. package/dist/components/fields/color/channels.js +1 -1
  204. package/dist/components/fields/color/color.js +2 -2
  205. package/dist/components/fields/color/color.js.map +1 -1
  206. package/dist/components/fields/color/context.js +1 -1
  207. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  208. package/dist/components/form/Form/Field.js +1 -1
  209. package/dist/components/form/Form/Form.js +1 -1
  210. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  211. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  212. package/dist/components/form/Form/SubmitError.js +1 -1
  213. package/dist/components/form/Form/index.js +1 -1
  214. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  215. package/dist/components/form/Form/use-field/use-field.js +1 -1
  216. package/dist/components/form/Form/use-form.js +1 -1
  217. package/dist/components/form/Form/validation.js +1 -1
  218. package/dist/components/form/Label.js +1 -1
  219. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  220. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  221. package/dist/components/form/validation/use-validation-props.js +1 -1
  222. package/dist/components/form/wrapper.js +1 -1
  223. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  224. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  225. package/dist/components/layout/Board/Board.js +2 -1
  226. package/dist/components/layout/Board/Board.js.map +1 -1
  227. package/dist/components/layout/Board/BoardProvider.js +1 -1
  228. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  229. package/dist/components/layout/Board/Widget.js +1 -1
  230. package/dist/components/layout/Board/WidgetHost.js +42 -7
  231. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  232. package/dist/components/layout/Board/board-context.js +1 -1
  233. package/dist/components/layout/Board/board-store.js +1 -1
  234. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  235. package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
  236. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  237. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  238. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  239. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  240. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  241. package/dist/components/layout/Board/grid-core/placement.js +1 -1
  242. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  243. package/dist/components/layout/Board/index.js +1 -1
  244. package/dist/components/layout/Board/responsive-utils.js +1 -1
  245. package/dist/components/layout/Board/use-board-layout.js +1 -1
  246. package/dist/components/layout/Board/use-board-registry.js +1 -1
  247. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  248. package/dist/components/layout/Board/use-board-selection.js +1 -1
  249. package/dist/components/layout/Flex.js +1 -1
  250. package/dist/components/layout/Flow.js +1 -1
  251. package/dist/components/layout/Grid.js +1 -1
  252. package/dist/components/layout/Panel.js +1 -1
  253. package/dist/components/layout/Prefix.js +1 -1
  254. package/dist/components/layout/ResizablePanel.js +1 -1
  255. package/dist/components/layout/Space.js +1 -1
  256. package/dist/components/layout/Suffix.js +1 -1
  257. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  258. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  259. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  260. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  261. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  262. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  263. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  264. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  265. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  266. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  267. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  268. package/dist/components/navigation/Tabs/styled.js +1 -1
  269. package/dist/components/navigation/Tabs/types.js +1 -1
  270. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  271. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  272. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  273. package/dist/components/other/Calendar/Calendar.js +1 -1
  274. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  275. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  276. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  277. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  278. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  279. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  280. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  281. package/dist/components/other/Calendar/styled.js +1 -1
  282. package/dist/components/other/CubeLogo/CubeLogo.d.ts +2 -2
  283. package/dist/components/other/CubeLogo/CubeLogo.js +12 -12
  284. package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -1
  285. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  286. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  287. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  288. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  289. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  290. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  291. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  292. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  293. package/dist/components/overlays/Dialog/context.js +1 -1
  294. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  295. package/dist/components/overlays/Modal/Modal.js +1 -1
  296. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  297. package/dist/components/overlays/Modal/Overlay.js +1 -1
  298. package/dist/components/overlays/Modal/Popover.js +1 -1
  299. package/dist/components/overlays/Modal/Tray.js +1 -1
  300. package/dist/components/overlays/Modal/Underlay.js +1 -1
  301. package/dist/components/overlays/Notifications/Notification.js +1 -1
  302. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  303. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  304. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  305. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  306. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  307. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  308. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  309. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  310. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  311. package/dist/components/overlays/Notifications/index.js +1 -1
  312. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  313. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  314. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  315. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  316. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  317. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  318. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  319. package/dist/components/overlays/Toast/index.js +1 -1
  320. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  321. package/dist/components/overlays/Toast/useToast.js +1 -1
  322. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  323. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  324. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  325. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  326. package/dist/components/overlays/Tooltip/context.js +1 -1
  327. package/dist/components/portal/Portal.js +1 -1
  328. package/dist/components/portal/PortalProvider.js +1 -1
  329. package/dist/components/portal/usePortal.js +1 -1
  330. package/dist/components/shared/DraggableCollection.js +1 -1
  331. package/dist/components/shared/InvalidIcon.js +1 -1
  332. package/dist/components/shared/ValidIcon.js +1 -1
  333. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  334. package/dist/components/status/Spin/Cube.js +1 -1
  335. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  336. package/dist/components/status/Spin/Spin.js +1 -1
  337. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  338. package/dist/data/item-themes.js +1 -1
  339. package/dist/data/item-themes.js.map +1 -1
  340. package/dist/data/themes.js +1 -1
  341. package/dist/data/themes.js.map +1 -1
  342. package/dist/eslint-plugin/defaults.generated.js +1 -1
  343. package/dist/eslint-plugin/index.js +1 -1
  344. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  345. package/dist/i18n/I18nProvider.js +1 -1
  346. package/dist/i18n/createFormatter.js +1 -1
  347. package/dist/i18n/index.js +1 -1
  348. package/dist/i18n/instance.js +1 -1
  349. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  350. package/dist/i18n/locales/en-US/uikit.js +1 -1
  351. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  352. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  353. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  354. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  355. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  356. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  357. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  358. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  359. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  360. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  361. package/dist/i18n/locales.js +1 -1
  362. package/dist/i18n/useFormatter.js +1 -1
  363. package/dist/i18n/useI18n.js +1 -1
  364. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  365. package/dist/icons/AdjustmentsIcon.js +1 -1
  366. package/dist/icons/AiIcon.js +1 -1
  367. package/dist/icons/AreaChartIcon.js +1 -1
  368. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  369. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  370. package/dist/icons/BackwardIcon.js +1 -1
  371. package/dist/icons/BarChartIcon.js +1 -1
  372. package/dist/icons/BellFilledIcon.js +1 -1
  373. package/dist/icons/BellIcon.js +1 -1
  374. package/dist/icons/BooleanIcon.js +1 -1
  375. package/dist/icons/CalendarEditIcon.js +1 -1
  376. package/dist/icons/CalendarIcon.js +1 -1
  377. package/dist/icons/CaretDownIcon.js +1 -1
  378. package/dist/icons/CaretUpIcon.js +1 -1
  379. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  380. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  381. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  382. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  383. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  384. package/dist/icons/ChartBarLineIcon.js +1 -1
  385. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  386. package/dist/icons/ChartBarStackedIcon.js +1 -1
  387. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  388. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  389. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  390. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  391. package/dist/icons/ChartBubbleIcon.js +1 -1
  392. package/dist/icons/ChartDonut2Icon.js +1 -1
  393. package/dist/icons/ChartFunnelIcon.js +1 -1
  394. package/dist/icons/ChartHeatmapIcon.js +1 -1
  395. package/dist/icons/ChartKPIIcon.js +1 -1
  396. package/dist/icons/ChartPie2Icon.js +1 -1
  397. package/dist/icons/ChartScatterIcon.js +1 -1
  398. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  399. package/dist/icons/CheckCircleIcon.js +1 -1
  400. package/dist/icons/CheckIcon.js +1 -1
  401. package/dist/icons/CircleFilledIcon.js +1 -1
  402. package/dist/icons/ClearIcon.js +1 -1
  403. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  404. package/dist/icons/CloseCircleIcon.js +1 -1
  405. package/dist/icons/CloseIcon.js +1 -1
  406. package/dist/icons/CodeIcon.js +1 -1
  407. package/dist/icons/ColumnTotalIcon.js +1 -1
  408. package/dist/icons/CopyIcon.js +1 -1
  409. package/dist/icons/CountIcon.js +1 -1
  410. package/dist/icons/CubeIcon.js +1 -1
  411. package/dist/icons/CubePauseIcon.js +1 -1
  412. package/dist/icons/CubePlayIcon.js +1 -1
  413. package/dist/icons/CurrencyDollarIcon.js +1 -1
  414. package/dist/icons/DangerIcon.js +1 -1
  415. package/dist/icons/DashboardIcon.js +1 -1
  416. package/dist/icons/DatabaseIcon.js +1 -1
  417. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  418. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  419. package/dist/icons/DirectionIcon.js +1 -1
  420. package/dist/icons/DonutIcon.js +1 -1
  421. package/dist/icons/DownIcon.js +1 -1
  422. package/dist/icons/EditIcon.js +1 -1
  423. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  424. package/dist/icons/ExclamationCircleIcon.js +1 -1
  425. package/dist/icons/ExclamationIcon.js +1 -1
  426. package/dist/icons/EyeIcon.js +1 -1
  427. package/dist/icons/EyeInvisibleIcon.js +1 -1
  428. package/dist/icons/FilterIcon.js +1 -1
  429. package/dist/icons/FolderFilledIcon.js +1 -1
  430. package/dist/icons/FolderIcon.js +1 -1
  431. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  432. package/dist/icons/FolderOpenIcon.js +1 -1
  433. package/dist/icons/ForwardIcon.js +1 -1
  434. package/dist/icons/GripVerticalIcon.js +1 -1
  435. package/dist/icons/HierarchyIcon.js +1 -1
  436. package/dist/icons/HierarchyOpenIcon.js +1 -1
  437. package/dist/icons/Icon.js +1 -1
  438. package/dist/icons/InfoCircleIcon.js +1 -1
  439. package/dist/icons/InfoIcon.js +1 -1
  440. package/dist/icons/KeyIcon.js +1 -1
  441. package/dist/icons/LeftIcon.js +1 -1
  442. package/dist/icons/LineChartIcon.js +1 -1
  443. package/dist/icons/LoadingIcon.js +1 -1
  444. package/dist/icons/LockFilledIcon.js +1 -1
  445. package/dist/icons/LockIcon.js +1 -1
  446. package/dist/icons/MoreIcon.js +1 -1
  447. package/dist/icons/NotAllowedIcon.js +1 -1
  448. package/dist/icons/Number123Icon.js +1 -1
  449. package/dist/icons/NumberIcon.js +1 -1
  450. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  451. package/dist/icons/PauseCircleIcon.js +1 -1
  452. package/dist/icons/PauseIcon.js +1 -1
  453. package/dist/icons/PercentageIcon.js +1 -1
  454. package/dist/icons/PieChartIcon.js +1 -1
  455. package/dist/icons/PipetteIcon.js +1 -1
  456. package/dist/icons/PlayCircleIcon.js +1 -1
  457. package/dist/icons/PlayIcon.js +1 -1
  458. package/dist/icons/PlusIcon.js +1 -1
  459. package/dist/icons/ProgressBarIcon.js +1 -1
  460. package/dist/icons/ReloadIcon.js +1 -1
  461. package/dist/icons/ReportIcon.js +1 -1
  462. package/dist/icons/ReturnIcon.js +1 -1
  463. package/dist/icons/RightIcon.js +1 -1
  464. package/dist/icons/RowTotalsIcon.js +1 -1
  465. package/dist/icons/SchemeIcon.js +1 -1
  466. package/dist/icons/SearchIcon.js +1 -1
  467. package/dist/icons/SemanticQueryIcon.js +1 -1
  468. package/dist/icons/SettingsIcon.js +1 -1
  469. package/dist/icons/ShieldFilledIcon.js +1 -1
  470. package/dist/icons/ShieldIcon.js +1 -1
  471. package/dist/icons/SlashIcon.js +1 -1
  472. package/dist/icons/SparklesIcon.js +1 -1
  473. package/dist/icons/SqlIcon.js +1 -1
  474. package/dist/icons/StatsIcon.js +1 -1
  475. package/dist/icons/StopIcon.js +1 -1
  476. package/dist/icons/StringIcon.js +1 -1
  477. package/dist/icons/SubtotalsIcon.js +1 -1
  478. package/dist/icons/SwitchIcon.js +1 -1
  479. package/dist/icons/TableIcon.js +1 -1
  480. package/dist/icons/ThumbsDownIcon.js +1 -1
  481. package/dist/icons/ThumbsUpIcon.js +1 -1
  482. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  483. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  484. package/dist/icons/ThunderboltIcon.js +1 -1
  485. package/dist/icons/TimeIcon.js +1 -1
  486. package/dist/icons/TrashIcon.js +1 -1
  487. package/dist/icons/UnlockIcon.js +1 -1
  488. package/dist/icons/UpIcon.js +1 -1
  489. package/dist/icons/UserGroupIcon.js +1 -1
  490. package/dist/icons/UserIcon.js +1 -1
  491. package/dist/icons/UserLockIcon.js +1 -1
  492. package/dist/icons/ViewIcon.js +1 -1
  493. package/dist/icons/WarningFilledIcon.js +1 -1
  494. package/dist/icons/WarningIcon.js +1 -1
  495. package/dist/icons/wrap-icon.js +1 -1
  496. package/dist/index.d.ts +2 -1
  497. package/dist/index.js +3 -2
  498. package/dist/index.js.map +1 -1
  499. package/dist/probe/canonicalize.js +1 -1
  500. package/dist/probe/css.js +1 -1
  501. package/dist/probe/index.js +1 -1
  502. package/dist/provider.js +1 -1
  503. package/dist/providers/TrackingProvider.js +1 -1
  504. package/dist/providers/navigationAdapter.default.js +1 -1
  505. package/dist/tokens/all-tokens.js +1 -1
  506. package/dist/tokens/base.js +1 -1
  507. package/dist/tokens/color-seed.js +1 -1
  508. package/dist/tokens/color-theme.d.ts +2 -2
  509. package/dist/tokens/color-theme.js +2 -2
  510. package/dist/tokens/color-theme.js.map +1 -1
  511. package/dist/tokens/colors.d.ts +3 -3
  512. package/dist/tokens/colors.js +4 -4
  513. package/dist/tokens/colors.js.map +1 -1
  514. package/dist/tokens/layout.js +1 -1
  515. package/dist/tokens/lazy-styles.js +1 -1
  516. package/dist/tokens/palette-config.d.ts +1 -1
  517. package/dist/tokens/palette-config.js +1 -1
  518. package/dist/tokens/palette-config.js.map +1 -1
  519. package/dist/tokens/palette.d.ts +5 -5
  520. package/dist/tokens/palette.js +11 -11
  521. package/dist/tokens/palette.js.map +1 -1
  522. package/dist/tokens/resolve.d.ts +1 -1
  523. package/dist/tokens/resolve.js +12 -31
  524. package/dist/tokens/resolve.js.map +1 -1
  525. package/dist/tokens/shadows.d.ts +1 -1
  526. package/dist/tokens/shadows.js +2 -2
  527. package/dist/tokens/shadows.js.map +1 -1
  528. package/dist/tokens/sizes.js +1 -1
  529. package/dist/tokens/spacing.js +1 -1
  530. package/dist/tokens/typography.js +1 -1
  531. package/dist/utils/ResizeSensor.js +1 -1
  532. package/dist/utils/index.d.ts +1 -0
  533. package/dist/utils/is-dev-env.js +1 -1
  534. package/dist/utils/modules.js +1 -1
  535. package/dist/utils/promise.js +1 -1
  536. package/dist/utils/raf.js +1 -1
  537. package/dist/utils/random.js +1 -1
  538. package/dist/utils/range.js +1 -1
  539. package/dist/utils/react/RenderCache.js +1 -1
  540. package/dist/utils/react/Slots.js +1 -1
  541. package/dist/utils/react/chain.js +1 -1
  542. package/dist/utils/react/disabledProps.js +1 -1
  543. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  544. package/dist/utils/react/index.d.ts +1 -0
  545. package/dist/utils/react/index.js +2 -1
  546. package/dist/utils/react/interactions.js +1 -1
  547. package/dist/utils/react/isTextOnly.js +1 -1
  548. package/dist/utils/react/mapProps.js +1 -1
  549. package/dist/utils/react/mergeProps.js +1 -1
  550. package/dist/utils/react/nullableValue.js +1 -1
  551. package/dist/utils/react/resolveIcon.js +1 -1
  552. package/dist/utils/react/sharedStore.js +1 -1
  553. package/dist/utils/react/useBufferedValue.js +1 -1
  554. package/dist/utils/react/useCombinedRefs.js +1 -1
  555. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  556. package/dist/utils/react/useEventBus.js +1 -1
  557. package/dist/utils/react/useId.js +1 -1
  558. package/dist/utils/react/useIsDarwin.js +1 -1
  559. package/dist/utils/react/useKeySymbols.js +1 -1
  560. package/dist/utils/react/useLayoutEffect.js +1 -1
  561. package/dist/utils/react/useLocalStorage.js +1 -1
  562. package/dist/utils/react/useMergeStyles.js +1 -1
  563. package/dist/utils/react/usePopoverSync.js +1 -1
  564. package/dist/utils/react/useQaProps.js +1 -1
  565. package/dist/utils/react/useSchema.d.ts +58 -0
  566. package/dist/utils/react/useSchema.js +182 -0
  567. package/dist/utils/react/useSchema.js.map +1 -0
  568. package/dist/utils/react/useViewportSize.js +1 -1
  569. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  570. package/dist/utils/selection.js +1 -1
  571. package/dist/utils/styles.js +1 -1
  572. package/dist/utils/tree.js +1 -1
  573. package/dist/utils/warnings.js +1 -1
  574. package/dist/version.js +2 -2
  575. package/docs/Colors.md +2 -2
  576. package/docs/Introduction.md +1 -1
  577. package/docs/Theming.md +29 -12
  578. package/docs/Usage.md +28 -11
  579. package/docs/components/content/ItemCard.md +1 -1
  580. package/docs/components/content/PrismCode.md +2 -2
  581. package/docs/components/data/DataTable.md +1 -1
  582. package/docs/components/fields/Picker.md +1 -1
  583. package/docs/components/layout/Board.md +147 -36
  584. package/docs/components/organisms/StatsCard.md +1 -1
  585. package/docs/components/other/CubeLogo.md +9 -9
  586. package/docs/components/overlays/Tooltip.md +2 -2
  587. package/docs/components/overlays/TooltipProvider.md +1 -1
  588. package/package.json +1 -1
@@ -0,0 +1,182 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
+ import { useSyncExternalStore } from "react";
3
+
4
+ //#region src/utils/react/useSchema.ts
5
+ /**
6
+ * The ambient viewing conditions — the color schema and the contrast tier the
7
+ * document is showing right now.
8
+ *
9
+ * This module is the single owner of the definition: it builds the `@dark` /
10
+ * `@hc` predefined states that `src/components/Root.tsx` registers with tasty,
11
+ * *and* it answers the same question in JS. One definition, two readers, so the
12
+ * CSS and the JS answers cannot drift apart.
13
+ *
14
+ * **For styling, do not use this.** `{ '': light, '@dark': dark, '@hc': hc }` is
15
+ * the answer, and branching styles in JS gives up the conditionality that lets a
16
+ * schema flip repaint without a re-render. Two cases the state map cannot serve:
17
+ *
18
+ * 1. **Surfaces the stylesheet does not reach** — a Vega spec, a CodeMirror or
19
+ * Monaco theme, a third-party iframe. They take values, not CSS, so `@dark`
20
+ * never applies and the branch has to happen in JS.
21
+ * 2. **Control state that is not styling** — seeding or labelling a control from
22
+ * the ambient condition, e.g. a Light/Dark or Normal/High-contrast preview
23
+ * selector that starts on whatever the page is already showing.
24
+ *
25
+ * Root-level only, and deliberately not a generic state reader: tasty's state
26
+ * vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with
27
+ * ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is
28
+ * answerable without an element. Evaluating the state language in JS would mean
29
+ * a second implementation of the state algebra to keep in agreement with the CSS
30
+ * one, for a question almost every caller asks about the root anyway.
31
+ */
32
+ /**
33
+ * The `data-*` attribute names the opt-in uses, and the media queries it falls
34
+ * back to. `@root(schema=dark)` compiles to `:root[data-schema="dark"]`, hence
35
+ * the `data-` prefix on the DOM side and the bare key on the tasty side.
36
+ */
37
+ const SCHEMA_KEY = "schema";
38
+ const CONTRAST_KEY = "contrast";
39
+ const SCHEMA_ATTR = `data-${SCHEMA_KEY}`;
40
+ const CONTRAST_ATTR = `data-${CONTRAST_KEY}`;
41
+ const DARK_QUERY = "(prefers-color-scheme: dark)";
42
+ const HIGH_CONTRAST_QUERY = "(prefers-contrast: more)";
43
+ /**
44
+ * The `@dark` / `@hc` state aliases, in tasty's DSL — registered globally by
45
+ * `<Root>` via `setGlobalPredefinedStates()`.
46
+ *
47
+ * The attribute opt-in wins over the system preference, and the fallback is
48
+ * gated on the attribute being *absent* (`!@root(schema)`) rather than on it
49
+ * being some other value — so `<html data-schema="light">` stays light inside a
50
+ * dark OS, which is the whole point of an opt-in. {@link resolveSchema} and
51
+ * {@link resolveHighContrast} read the same way.
52
+ */
53
+ const AMBIENT_PREDEFINED_STATES = {
54
+ "@dark": `@root(${SCHEMA_KEY}=dark) | (!@root(${SCHEMA_KEY}) & @media${DARK_QUERY})`,
55
+ "@hc": `@root(${CONTRAST_KEY}=high) | (!@root(${CONTRAST_KEY}) & @media${HIGH_CONTRAST_QUERY})`
56
+ };
57
+ /**
58
+ * `matchMedia` is called per read rather than cached, so a test that stubs it
59
+ * takes effect immediately. Missing (older jsdom, non-DOM runtimes) reads as
60
+ * "no preference", which lands on the light / normal-contrast defaults.
61
+ */
62
+ function mediaMatches(query) {
63
+ return typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia(query).matches : false;
64
+ }
65
+ function rootAttribute(name) {
66
+ return typeof document === "undefined" ? null : document.documentElement.getAttribute(name);
67
+ }
68
+ /**
69
+ * The document's current color schema, read once — the JS answer to `@dark`.
70
+ *
71
+ * Outside React (a chart spec built in a module, an editor theme registered at
72
+ * import time). In React use {@link useSchema}, which also re-renders on change.
73
+ * Returns `'light'` with no DOM.
74
+ */
75
+ function resolveSchema() {
76
+ const attribute = rootAttribute(SCHEMA_ATTR);
77
+ if (attribute !== null) return attribute === "dark" ? "dark" : "light";
78
+ return mediaMatches(DARK_QUERY) ? "dark" : "light";
79
+ }
80
+ /**
81
+ * Whether the document is showing the high-contrast tier, read once — the JS
82
+ * answer to `@hc`.
83
+ *
84
+ * Note this is an *ambient* condition, not the theme's `contrastLevel`: the
85
+ * level is a `PaletteConfig` seed the app supplies (read it with
86
+ * `getPaletteConfig()`), while this is the tier the viewer asked for.
87
+ * Returns `false` with no DOM.
88
+ */
89
+ function resolveHighContrast() {
90
+ const attribute = rootAttribute(CONTRAST_ATTR);
91
+ if (attribute !== null) return attribute === "high";
92
+ return mediaMatches(HIGH_CONTRAST_QUERY);
93
+ }
94
+ const listeners = /* @__PURE__ */ new Set();
95
+ let stopWatching = null;
96
+ function notify() {
97
+ listeners.forEach((listener) => listener());
98
+ }
99
+ /**
100
+ * Both inputs have to be watched, because either can decide the answer: the
101
+ * attribute when the opt-in is set, the media query otherwise — an attribute flip
102
+ * is invisible to `matchMedia` and a system flip is invisible to a
103
+ * `MutationObserver`. One observer and one pair of query listeners are shared by
104
+ * every subscriber, and torn down when the last one leaves.
105
+ */
106
+ function startWatching() {
107
+ if (typeof document === "undefined") return () => {};
108
+ const teardowns = [];
109
+ if (typeof window !== "undefined" && typeof window.matchMedia === "function") for (const query of [DARK_QUERY, HIGH_CONTRAST_QUERY]) {
110
+ const list = window.matchMedia(query);
111
+ if (typeof list?.addEventListener !== "function") continue;
112
+ list.addEventListener("change", notify);
113
+ teardowns.push(() => list.removeEventListener("change", notify));
114
+ }
115
+ if (typeof MutationObserver === "function" && document.documentElement) {
116
+ const observer = new MutationObserver(notify);
117
+ observer.observe(document.documentElement, {
118
+ attributes: true,
119
+ attributeFilter: [SCHEMA_ATTR, CONTRAST_ATTR]
120
+ });
121
+ teardowns.push(() => observer.disconnect());
122
+ }
123
+ return () => teardowns.forEach((teardown) => teardown());
124
+ }
125
+ /**
126
+ * Subscribe to ambient condition changes — either the schema or the contrast
127
+ * tier. Returns an unsubscribe function.
128
+ *
129
+ * The listener takes no argument: re-read with {@link resolveSchema} /
130
+ * {@link resolveHighContrast}, which is what the hooks below do. For non-React
131
+ * consumers that own a surface the stylesheet cannot reach — re-theming a Monaco
132
+ * instance, re-rendering a chart.
133
+ */
134
+ function subscribeSchema(listener) {
135
+ listeners.add(listener);
136
+ if (!stopWatching) stopWatching = startWatching();
137
+ return () => {
138
+ listeners.delete(listener);
139
+ if (!listeners.size && stopWatching) {
140
+ stopWatching();
141
+ stopWatching = null;
142
+ }
143
+ };
144
+ }
145
+ /**
146
+ * Snapshots are primitives, so React bails out on an unchanged value and no
147
+ * memoization is needed — a contrast change re-runs a `useSchema()` reader's
148
+ * `getSnapshot` and stops there.
149
+ */
150
+ const getServerSchema = () => "light";
151
+ const getServerHighContrast = () => false;
152
+ /**
153
+ * The document's color schema, kept live — `'light'` or `'dark'`.
154
+ *
155
+ * ```tsx
156
+ * const schema = useSchema();
157
+ *
158
+ * <VegaChart spec={useMemo(() => buildSpec(schema), [schema])} />;
159
+ * ```
160
+ *
161
+ * Follows both the `<html data-schema>` opt-in and `prefers-color-scheme`,
162
+ * exactly as the `@dark` state does. Under SSR it renders `'light'` and
163
+ * re-renders with the real value after hydration.
164
+ */
165
+ function useSchema() {
166
+ return useSyncExternalStore(subscribeSchema, resolveSchema, getServerSchema);
167
+ }
168
+ /**
169
+ * Whether the document is showing the high-contrast tier, kept live — the hook
170
+ * form of {@link resolveHighContrast}, following `<html data-contrast>` and
171
+ * `prefers-contrast` exactly as the `@hc` state does.
172
+ *
173
+ * Under SSR it renders `false` and re-renders with the real value after
174
+ * hydration.
175
+ */
176
+ function useHighContrast() {
177
+ return useSyncExternalStore(subscribeSchema, resolveHighContrast, getServerHighContrast);
178
+ }
179
+
180
+ //#endregion
181
+ export { AMBIENT_PREDEFINED_STATES, resolveHighContrast, resolveSchema, subscribeSchema, useHighContrast, useSchema };
182
+ //# sourceMappingURL=useSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSchema.js","names":[],"sources":["../../../src/utils/react/useSchema.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\n/**\n * The ambient viewing conditions — the color schema and the contrast tier the\n * document is showing right now.\n *\n * This module is the single owner of the definition: it builds the `@dark` /\n * `@hc` predefined states that `src/components/Root.tsx` registers with tasty,\n * *and* it answers the same question in JS. One definition, two readers, so the\n * CSS and the JS answers cannot drift apart.\n *\n * **For styling, do not use this.** `{ '': light, '@dark': dark, '@hc': hc }` is\n * the answer, and branching styles in JS gives up the conditionality that lets a\n * schema flip repaint without a re-render. Two cases the state map cannot serve:\n *\n * 1. **Surfaces the stylesheet does not reach** — a Vega spec, a CodeMirror or\n * Monaco theme, a third-party iframe. They take values, not CSS, so `@dark`\n * never applies and the branch has to happen in JS.\n * 2. **Control state that is not styling** — seeding or labelling a control from\n * the ambient condition, e.g. a Light/Dark or Normal/High-contrast preview\n * selector that starts on whatever the page is already showing.\n *\n * Root-level only, and deliberately not a generic state reader: tasty's state\n * vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with\n * ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is\n * answerable without an element. Evaluating the state language in JS would mean\n * a second implementation of the state algebra to keep in agreement with the CSS\n * one, for a question almost every caller asks about the root anyway.\n */\n\n// ============================================================================\n// The definition\n// ============================================================================\n\n/**\n * The `data-*` attribute names the opt-in uses, and the media queries it falls\n * back to. `@root(schema=dark)` compiles to `:root[data-schema=\"dark\"]`, hence\n * the `data-` prefix on the DOM side and the bare key on the tasty side.\n */\nconst SCHEMA_KEY = 'schema';\nconst CONTRAST_KEY = 'contrast';\nconst SCHEMA_ATTR = `data-${SCHEMA_KEY}`;\nconst CONTRAST_ATTR = `data-${CONTRAST_KEY}`;\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\nconst HIGH_CONTRAST_QUERY = '(prefers-contrast: more)';\n\n/**\n * The `@dark` / `@hc` state aliases, in tasty's DSL — registered globally by\n * `<Root>` via `setGlobalPredefinedStates()`.\n *\n * The attribute opt-in wins over the system preference, and the fallback is\n * gated on the attribute being *absent* (`!@root(schema)`) rather than on it\n * being some other value — so `<html data-schema=\"light\">` stays light inside a\n * dark OS, which is the whole point of an opt-in. {@link resolveSchema} and\n * {@link resolveHighContrast} read the same way.\n */\nexport const AMBIENT_PREDEFINED_STATES = {\n '@dark': `@root(${SCHEMA_KEY}=dark) | (!@root(${SCHEMA_KEY}) & @media${DARK_QUERY})`,\n '@hc': `@root(${CONTRAST_KEY}=high) | (!@root(${CONTRAST_KEY}) & @media${HIGH_CONTRAST_QUERY})`,\n} as const;\n\n/** The color schema the document resolves to — the two arms of the `@dark` state. */\nexport type ColorSchema = 'light' | 'dark';\n\n// ============================================================================\n// Reading\n// ============================================================================\n\n/**\n * `matchMedia` is called per read rather than cached, so a test that stubs it\n * takes effect immediately. Missing (older jsdom, non-DOM runtimes) reads as\n * \"no preference\", which lands on the light / normal-contrast defaults.\n */\nfunction mediaMatches(query: string): boolean {\n return typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ? window.matchMedia(query).matches\n : false;\n}\n\nfunction rootAttribute(name: string): string | null {\n return typeof document === 'undefined'\n ? null\n : document.documentElement.getAttribute(name);\n}\n\n/**\n * The document's current color schema, read once — the JS answer to `@dark`.\n *\n * Outside React (a chart spec built in a module, an editor theme registered at\n * import time). In React use {@link useSchema}, which also re-renders on change.\n * Returns `'light'` with no DOM.\n */\nexport function resolveSchema(): ColorSchema {\n const attribute = rootAttribute(SCHEMA_ATTR);\n\n if (attribute !== null) {\n return attribute === 'dark' ? 'dark' : 'light';\n }\n\n return mediaMatches(DARK_QUERY) ? 'dark' : 'light';\n}\n\n/**\n * Whether the document is showing the high-contrast tier, read once — the JS\n * answer to `@hc`.\n *\n * Note this is an *ambient* condition, not the theme's `contrastLevel`: the\n * level is a `PaletteConfig` seed the app supplies (read it with\n * `getPaletteConfig()`), while this is the tier the viewer asked for.\n * Returns `false` with no DOM.\n */\nexport function resolveHighContrast(): boolean {\n const attribute = rootAttribute(CONTRAST_ATTR);\n\n if (attribute !== null) {\n return attribute === 'high';\n }\n\n return mediaMatches(HIGH_CONTRAST_QUERY);\n}\n\n// ============================================================================\n// Watching\n// ============================================================================\n\nconst listeners = new Set<() => void>();\n\nlet stopWatching: (() => void) | null = null;\n\nfunction notify() {\n listeners.forEach((listener) => listener());\n}\n\n/**\n * Both inputs have to be watched, because either can decide the answer: the\n * attribute when the opt-in is set, the media query otherwise — an attribute flip\n * is invisible to `matchMedia` and a system flip is invisible to a\n * `MutationObserver`. One observer and one pair of query listeners are shared by\n * every subscriber, and torn down when the last one leaves.\n */\nfunction startWatching(): () => void {\n if (typeof document === 'undefined') {\n return () => {};\n }\n\n const teardowns: (() => void)[] = [];\n\n // Guarded rather than assumed: jsdom ships neither `matchMedia` nor a\n // `MediaQueryList` in every version, and a consumer's unit tests are exactly\n // where a hook like this gets mounted. Losing one source of change is a stale\n // value; throwing is a broken render.\n if (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n for (const query of [DARK_QUERY, HIGH_CONTRAST_QUERY]) {\n const list = window.matchMedia(query);\n\n if (typeof list?.addEventListener !== 'function') continue;\n\n list.addEventListener('change', notify);\n teardowns.push(() => list.removeEventListener('change', notify));\n }\n }\n\n if (typeof MutationObserver === 'function' && document.documentElement) {\n const observer = new MutationObserver(notify);\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [SCHEMA_ATTR, CONTRAST_ATTR],\n });\n\n teardowns.push(() => observer.disconnect());\n }\n\n return () => teardowns.forEach((teardown) => teardown());\n}\n\n/**\n * Subscribe to ambient condition changes — either the schema or the contrast\n * tier. Returns an unsubscribe function.\n *\n * The listener takes no argument: re-read with {@link resolveSchema} /\n * {@link resolveHighContrast}, which is what the hooks below do. For non-React\n * consumers that own a surface the stylesheet cannot reach — re-theming a Monaco\n * instance, re-rendering a chart.\n */\nexport function subscribeSchema(listener: () => void): () => void {\n listeners.add(listener);\n\n if (!stopWatching) {\n stopWatching = startWatching();\n }\n\n return () => {\n listeners.delete(listener);\n\n if (!listeners.size && stopWatching) {\n stopWatching();\n stopWatching = null;\n }\n };\n}\n\n// ============================================================================\n// React bindings\n// ============================================================================\n\n/**\n * Snapshots are primitives, so React bails out on an unchanged value and no\n * memoization is needed — a contrast change re-runs a `useSchema()` reader's\n * `getSnapshot` and stops there.\n */\nconst getServerSchema = (): ColorSchema => 'light';\nconst getServerHighContrast = () => false;\n\n/**\n * The document's color schema, kept live — `'light'` or `'dark'`.\n *\n * ```tsx\n * const schema = useSchema();\n *\n * <VegaChart spec={useMemo(() => buildSpec(schema), [schema])} />;\n * ```\n *\n * Follows both the `<html data-schema>` opt-in and `prefers-color-scheme`,\n * exactly as the `@dark` state does. Under SSR it renders `'light'` and\n * re-renders with the real value after hydration.\n */\nexport function useSchema(): ColorSchema {\n return useSyncExternalStore(subscribeSchema, resolveSchema, getServerSchema);\n}\n\n/**\n * Whether the document is showing the high-contrast tier, kept live — the hook\n * form of {@link resolveHighContrast}, following `<html data-contrast>` and\n * `prefers-contrast` exactly as the `@hc` state does.\n *\n * Under SSR it renders `false` and re-renders with the real value after\n * hydration.\n */\nexport function useHighContrast(): boolean {\n return useSyncExternalStore(\n subscribeSchema,\n resolveHighContrast,\n getServerHighContrast,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,cAAc,QAAQ;AAC5B,MAAM,gBAAgB,QAAQ;AAC9B,MAAM,aAAa;AACnB,MAAM,sBAAsB;;;;;;;;;;;AAY5B,MAAa,4BAA4B;CACvC,SAAS,SAAS,WAAW,mBAAmB,WAAW,YAAY,WAAW;CAClF,OAAO,SAAS,aAAa,mBAAmB,aAAa,YAAY,oBAAoB;CAC9F;;;;;;AAcD,SAAS,aAAa,OAAwB;AAC5C,QAAO,OAAO,WAAW,eACvB,OAAO,OAAO,eAAe,aAC3B,OAAO,WAAW,MAAM,CAAC,UACzB;;AAGN,SAAS,cAAc,MAA6B;AAClD,QAAO,OAAO,aAAa,cACvB,OACA,SAAS,gBAAgB,aAAa,KAAK;;;;;;;;;AAUjD,SAAgB,gBAA6B;CAC3C,MAAM,YAAY,cAAc,YAAY;AAE5C,KAAI,cAAc,KAChB,QAAO,cAAc,SAAS,SAAS;AAGzC,QAAO,aAAa,WAAW,GAAG,SAAS;;;;;;;;;;;AAY7C,SAAgB,sBAA+B;CAC7C,MAAM,YAAY,cAAc,cAAc;AAE9C,KAAI,cAAc,KAChB,QAAO,cAAc;AAGvB,QAAO,aAAa,oBAAoB;;AAO1C,MAAM,4BAAY,IAAI,KAAiB;AAEvC,IAAI,eAAoC;AAExC,SAAS,SAAS;AAChB,WAAU,SAAS,aAAa,UAAU,CAAC;;;;;;;;;AAU7C,SAAS,gBAA4B;AACnC,KAAI,OAAO,aAAa,YACtB,cAAa;CAGf,MAAM,YAA4B,EAAE;AAMpC,KACE,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,WAE7B,MAAK,MAAM,SAAS,CAAC,YAAY,oBAAoB,EAAE;EACrD,MAAM,OAAO,OAAO,WAAW,MAAM;AAErC,MAAI,OAAO,MAAM,qBAAqB,WAAY;AAElD,OAAK,iBAAiB,UAAU,OAAO;AACvC,YAAU,WAAW,KAAK,oBAAoB,UAAU,OAAO,CAAC;;AAIpE,KAAI,OAAO,qBAAqB,cAAc,SAAS,iBAAiB;EACtE,MAAM,WAAW,IAAI,iBAAiB,OAAO;AAE7C,WAAS,QAAQ,SAAS,iBAAiB;GACzC,YAAY;GACZ,iBAAiB,CAAC,aAAa,cAAc;GAC9C,CAAC;AAEF,YAAU,WAAW,SAAS,YAAY,CAAC;;AAG7C,cAAa,UAAU,SAAS,aAAa,UAAU,CAAC;;;;;;;;;;;AAY1D,SAAgB,gBAAgB,UAAkC;AAChE,WAAU,IAAI,SAAS;AAEvB,KAAI,CAAC,aACH,gBAAe,eAAe;AAGhC,cAAa;AACX,YAAU,OAAO,SAAS;AAE1B,MAAI,CAAC,UAAU,QAAQ,cAAc;AACnC,iBAAc;AACd,kBAAe;;;;;;;;;AAcrB,MAAM,wBAAqC;AAC3C,MAAM,8BAA8B;;;;;;;;;;;;;;AAepC,SAAgB,YAAyB;AACvC,QAAO,qBAAqB,iBAAiB,eAAe,gBAAgB;;;;;;;;;;AAW9E,SAAgB,kBAA2B;AACzC,QAAO,qBACL,iBACA,qBACA,sBACD"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  import { useEffect, useState } from "react";
3
3
 
4
4
  //#region src/utils/react/useViewportSize.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  import { isValidElement } from "react";
3
3
  import { isFragment } from "react-is";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  //#region src/utils/selection.ts
3
3
  /**
4
4
  * Deduplicate/toggle keys in a selection: if a key appears twice it is
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  //#region src/utils/styles.ts
3
3
  /**
4
4
  * Split properties into style and non-style properties.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  //#region src/utils/tree.ts
3
3
  function toFlatTree(tree, includingFolders) {
4
4
  return tree.reduce((result, node) => {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  //#region src/utils/warnings.ts
3
3
  const SUGGESTED_PROP_MAP = {
4
4
  disabled: "isDisabled",
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.169.1 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
2
2
  //#region src/version.ts
3
- const VERSION = "0.169.1";
3
+ const VERSION = "0.170.0";
4
4
  const TASTY_VERSION = "3.3.1";
5
5
  if (typeof window !== "undefined") {
6
6
  const version = VERSION;
package/docs/Colors.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Colors
2
2
 
3
- Cube UI Kit color tokens are generated by Glaze from a shared OKHST palette. Every adaptive token includes light, dark, and high-contrast variants. Change the active scheme in the Storybook toolbar to review each example.
3
+ Cube UI Kit color tokens are generated by Glaze from a shared OKHST palette. Every adaptive token includes light, dark, and high-contrast variants. Change the active schema in the Storybook toolbar to review each example.
4
4
 
5
5
  The colors shown here come from the default seeds. Those seeds — brand hue, saturation, per-status hues — are tunable at runtime; see [Theming](./Theming.md) for a live playground.
6
6
 
@@ -50,7 +50,7 @@ Syntax tokens are calibrated as a group against `#surface`. Use the semantic tok
50
50
 
51
51
  ## Borders and shadows
52
52
 
53
- Borders use the `1bw` design-system width. Shadow geometry comes from `src/tokens/shadows.ts`; the `#shadow-sm`, `#shadow-md`, and `#shadow-lg` colors adapt with the active scheme.
53
+ Borders use the `1bw` design-system width. Shadow geometry comes from `src/tokens/shadows.ts`; the `#shadow-sm`, `#shadow-md`, and `#shadow-lg` colors adapt with the active schema.
54
54
 
55
55
  ## Scope
56
56
 
@@ -17,7 +17,7 @@ Cube UI Kit is built on two independent open-source projects:
17
17
  - [Tasty](https://tasty.style) is the declarative styling engine. It turns token-aware style objects, responsive values, and component states into conflict-free CSS.
18
18
  - [Glaze](https://github.com/tenphi/glaze) generates the semantic color palette. A small set of brand and status seeds resolves into light, dark, and high-contrast token sets.
19
19
 
20
- Use the [Theme Builder](/story/getting-started-theming--theme-builder) to tune a palette and preview the result across schemes and contrast levels.
20
+ Use the [Theme Builder](/story/getting-started-theming--theme-builder) to tune a palette and preview the result across schemas and contrast levels.
21
21
 
22
22
  ## Get started
23
23
 
package/docs/Theming.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Theming
2
2
 
3
- The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a handful of seeds, one per **zone**: the accent, the base, and each of the four status themes. Those seeds are tunable at runtime — change one and every token re-resolves, in light, dark, and high-contrast schemes at once.
3
+ The whole palette is generated by [Glaze](https://github.com/tenphi/glaze) from a handful of seeds, one per **zone**: the accent, the base, and each of the four status themes. Those seeds are tunable at runtime — change one and every token re-resolves, in light, dark, and high-contrast schemas at once.
4
4
 
5
5
  Every zone takes the same seed, and it comes in two forms: a **color**, which is usually what you actually have, or the **numbers** behind one. Never both — a zone is seeded one way or the other. See [One seed, two ways to spell it](#one-seed-two-ways-to-spell-it).
6
6
 
@@ -133,7 +133,7 @@ First, **exactness is scoped to the light, normal-contrast variant.** That is th
133
133
 
134
134
  Sizing those two the same is a mistake worth naming, because this palette made it. In light `surface` **is** white, so one measurement is both constraints at once and Lc 45 looks right for the pair. In dark the page is near-black and the same number becomes a demand that a filled shape reach text contrast against it — which nothing in the palette meets, the shipped fill included. Since a floor can only lighten, the surplus flattened the dark half of the tone axis onto a single value: every brand darker than the floor came out the same colour. The page floor is now sized for a shape and the label is guaranteed separately, by a cap on the seed's tone.
135
135
 
136
- They are APCA rather than WCAG on purpose. A single WCAG ratio means two different things depending on the scheme: measured across twelve hues, a fill sitting exactly at 3:1 comes out at Lc 56 in light but only Lc 23 in dark. That is why light brands kept getting crushed while dark ones sailed through the same rule. **A consequence to state plainly: the emitted fill can sit below WCAG 3:1.** `#0EA5E9` renders at 2.77:1 against a white page and is correct there — the Lc is the guarantee, not the ratio.
136
+ They are APCA rather than WCAG on purpose. A single WCAG ratio means two different things depending on the schema: measured across twelve hues, a fill sitting exactly at 3:1 comes out at Lc 56 in light but only Lc 23 in dark. That is why light brands kept getting crushed while dark ones sailed through the same rule. **A consequence to state plainly: the emitted fill can sit below WCAG 3:1.** `#0EA5E9` renders at 2.77:1 against a white page and is correct there — the Lc is the guarantee, not the ratio.
137
137
 
138
138
  High contrast does **not** escalate the page floor. It is a request for separation over brand, but not for separation from the page: the same fill carries the label, and driving it off the page drives the label off it. The shipped ladder makes the same trade and lands the other side of it, ending up with _less_ page separation in high contrast than in normal, because it darkens the fill toward its label. What does escalate is the label cap, which searches the high-contrast variants too.
139
139
 
@@ -173,7 +173,7 @@ setPaletteConfig({ surfaceMode: 'tinted', base: { saturation: 25 } });
173
173
 
174
174
  Two tones is not a lightness change you would name — it is _room_. Everything below `surface` is positioned relative to it, so the ladder, the borders and the text ramp all follow, and the text's `['AA','AAA']` floors re-solve against the new background rather than drifting. The `code-*` family follows too: its mirrored `surface` exists to be the page, so it tracks both the tone and the base seed.
175
175
 
176
- **The tinted surfaces move with it.** A status theme's `surface` — and a runtime tint's, from `getColorTheme()` — is authored as an offset from the page's rather than as an absolute tone, and that offset is exactly the two tones `tinted` shifts by. Anchored absolutely they would land on the page's own new tone and a `note` banner would stop reading as a banner at all; anchored to the page they keep the separation the offset was chosen for, in both schemes. They also pick up a little more chroma there, being further from the extreme — so `tinted` makes a status surface easier to see, not harder.
176
+ **The tinted surfaces move with it.** A status theme's `surface` — and a runtime tint's, from `getColorTheme()` — is authored as an offset from the page's rather than as an absolute tone, and that offset is exactly the two tones `tinted` shifts by. Anchored absolutely they would land on the page's own new tone and a `note` banner would stop reading as a banner at all; anchored to the page they keep the separation the offset was chosen for, in both schemas. They also pick up a little more chroma there, being further from the extreme — so `tinted` makes a status surface easier to see, not harder.
177
177
 
178
178
  The tint stays subtle by construction. Near white the sRGB gamut has very little chroma to give, so `tinted` buys a surface that reads as warm or cool rather than one that reads as colored — which is the whole ask. For a genuinely colored panel, reach for a status theme's `surface` instead.
179
179
 
@@ -331,7 +331,7 @@ The preview deliberately shows all three surface levels with their own text ramp
331
331
 
332
332
  ## Previewing a theme in a region
333
333
 
334
- `setPaletteConfig()` re-themes the whole document, which is no use for a theme picker — you want several themes visible at once, or a dark preview inside a light page. `renderColorTokens()` does that: it resolves the palette for **one** config and **one** scheme and returns flat literal values, ready to apply to a subtree through a tasty `tokens` prop.
334
+ `setPaletteConfig()` re-themes the whole document, which is no use for a theme picker — you want several themes visible at once, or a dark preview inside a light page. `renderColorTokens()` does that: it resolves the palette for **one** config and **one** schema and returns flat literal values, ready to apply to a subtree through a tasty `tokens` prop.
335
335
 
336
336
  ```tsx
337
337
  import { renderColorTokens, tasty } from '@cube-dev/ui-kit';
@@ -339,20 +339,20 @@ import { renderColorTokens, tasty } from '@cube-dev/ui-kit';
339
339
  const Region = tasty({ styles: { fill: '#surface', color: '#surface-text' } });
340
340
 
341
341
  const preview = useMemo(
342
- () => renderColorTokens({ accent: { hue: 210 }, scheme: 'dark' }),
342
+ () => renderColorTokens({ accent: { hue: 210 }, schema: 'dark' }),
343
343
  [],
344
344
  );
345
345
 
346
346
  <Region tokens={preview}>…everything in here renders in that theme…</Region>;
347
347
  ```
348
348
 
349
- The reason this needs its own API: the document palette emits **state maps** (`{ '': …, '@dark': …, '@hc': … }`), so a page can only ever show one scheme at a time — that is what `@dark` means. Collapsing the palette to a chosen scheme removes the conditionality, so several themes can coexist.
349
+ The reason this needs its own API: the document palette emits **state maps** (`{ '': …, '@dark': …, '@hc': … }`), so a page can only ever show one schema at a time — that is what `@dark` means. Collapsing the palette to a chosen schema removes the conditionality, so several themes can coexist.
350
350
 
351
351
  | Option | Meaning |
352
352
  | --- | --- |
353
- | every `PaletteConfig` field | merged over the **current** config, so `{ scheme: 'dark' }` previews the active theme in dark |
354
- | `scheme` | `'light'` (default) or `'dark'` |
355
- | `highContrast` | resolve that scheme's high-contrast variant. Default `false` |
353
+ | every `PaletteConfig` field | merged over the **current** config, so `{ schema: 'dark' }` previews the active theme in dark |
354
+ | `schema` | `'light'` (default) or `'dark'` |
355
+ | `highContrast` | resolve that schema's high-contrast variant. Default `false` |
356
356
 
357
357
  Nothing is applied globally — the live palette and the stored config are untouched, so previews are safe to render anywhere.
358
358
 
@@ -360,10 +360,10 @@ Note the one place the merge/replace split matters: this call **layers** over th
360
360
 
361
361
  Notes:
362
362
 
363
- - Real components work inside a region. Every color in the kit compiles to a CSS custom property, so overriding those properties on one element re-colors its whole subtree with no scheme attribute and no second `<Root>`.
363
+ - Real components work inside a region. Every color in the kit compiles to a CSS custom property, so overriding those properties on one element re-colors its whole subtree with no schema attribute and no second `<Root>`.
364
364
  - The legacy aliases come along **by reference** (`'#dark': '#surface-text'`), and so do the shadow tokens and scrollbar colors, whose values embed a palette color. Tasty re-declares them on the region so each `var()` resolves against the region's own values; resolving them up front would freeze them to the outer theme instead.
365
365
  - Typography, spacing, sizes and layout are **not** included — nothing in their values references a color, so the region inherits them from `<Root>`.
366
- - `contrastLevel` works per region, so the whole 0–100 ramp can be shown at once — something a document cannot do, since it is only ever at one level. Level `0` reproduces the normal tier and `100` the high-contrast tier exactly, in both schemes. `highContrast: true` still returns the genuine high-contrast resolution at any level below `100`, because the level moves the baseline and the tier escalates from where `'auto'` would put it; at `100` the two coincide and it returns the same colors as the normal variant. Note that tokens carrying a contrast _floor_ (most text) can sit still over part of the ramp — the floor is solved, not approximated, so the value only moves once the interpolated target does. Tokens positioned by a plain tone pair, like `#border`, step at every level.
366
+ - `contrastLevel` works per region, so the whole 0–100 ramp can be shown at once — something a document cannot do, since it is only ever at one level. Level `0` reproduces the normal tier and `100` the high-contrast tier exactly, in both schemas. `highContrast: true` still returns the genuine high-contrast resolution at any level below `100`, because the level moves the baseline and the tier escalates from where `'auto'` would put it; at `100` the two coincide and it returns the same colors as the normal variant. Note that tokens carrying a contrast _floor_ (most text) can sit still over part of the ramp — the floor is solved, not approximated, so the value only moves once the interpolated target does. Tokens positioned by a plain tone pair, like `#border`, step at every level.
367
367
  - Resolving a palette costs a few milliseconds. The last config is memoized, but `useMemo` on the caller side if you drive it from state.
368
368
 
369
369
  `renderPaletteTokens()` is the same thing without the aliases and companion tokens, if you want only the Glaze palette.
@@ -395,6 +395,23 @@ subscribePaletteConfig(() => {
395
395
 
396
396
  `getPaletteConfig()` always returns the fully resolved form, so `getPaletteConfig().themes.danger.saturation` is a number even if nobody ever set it. `DEFAULT_PALETTE_CONFIG` is the shipped baseline in the same shape.
397
397
 
398
+ ## Reading the ambient schema
399
+
400
+ The palette config is what the app _asked for_; the schema and contrast tier are what the viewer is _seeing_ — `<html data-schema>` / `prefers-color-scheme`, and `<html data-contrast>` / `prefers-contrast`. They are not part of the config, so `getPaletteConfig()` says nothing about them:
401
+
402
+ ```tsx
403
+ import { useHighContrast, useSchema } from '@cube-dev/ui-kit';
404
+
405
+ const schema = useSchema(); // 'light' | 'dark'
406
+ const isHighContrast = useHighContrast(); // boolean
407
+ ```
408
+
409
+ Both resolve exactly as the `@dark` / `@hc` states do — attribute opt-in first, media query only when the attribute is absent — and re-render when either input changes. Outside React: `resolveSchema()`, `resolveHighContrast()` and `subscribeSchema(listener)`, which fires on a change to either condition.
410
+
411
+ Reach for these only where CSS cannot go. Styling belongs in a state map (`{ '': …, '@dark': …, '@hc': … }`), which repaints on a schema flip with no re-render at all. What the states cannot reach is a surface that takes values rather than CSS — a Vega spec, a CodeMirror or Monaco theme, an iframe — or a control whose value _is_ the condition, like the Light/Dark and Normal/High-contrast selectors over the [theme builder](#theme-builder).
412
+
413
+ Note the distinction from `contrastLevel`: the level is a config seed the app supplies and can read back, while high contrast is a viewing condition the document is in. They also pair up — `renderColorTokens({ schema, highContrast })` takes both, so a region can be previewed in the conditions the page is actually showing.
414
+
398
415
  ## `<Root palette>`
399
416
 
400
417
  `<Root>` accepts the same config as a prop, applied during render so the first paint is already correct:
@@ -420,7 +437,7 @@ This is a convenience wrapper over `setPaletteConfig()`, not a separate scope. *
420
437
 
421
438
  It also owns the accent's `saturation` outright — pinned to `100`, so a number passed _explicitly alongside_ it is inert and warned about (a number passed on its own turns pastel off instead). And it caps a color seed short of itself: the ceiling sits below where a saturated color lands, so `#EF4444` resolves to `#c47069`. Both are visible in the [Theme builder](#theme-builder), the first as a disabled slider and the second as the requested/resolved chips.
422
439
 
423
- **Re-seeding costs about 10 ms.** Rebuilding the eight themes and re-solving ~156 tokens across four scheme variants is not free, though it is inside a frame. A manual `contrastLevel` costs the same — it runs the same four passes — except at level `100`, which skips the two high-contrast ones because the normal pass already produced those values. Setting the config to a value it already holds is free — it does not even bump the version. If you are driving it from a slider, let the input coalesce to frames (a pointer-driven `onChange` already does) rather than writing on every event.
440
+ **Re-seeding costs about 10 ms.** Rebuilding the eight themes and re-solving ~156 tokens across four schema variants is not free, though it is inside a frame. A manual `contrastLevel` costs the same — it runs the same four passes — except at level `100`, which skips the two high-contrast ones because the normal pass already produced those values. Setting the config to a value it already holds is free — it does not even bump the version. If you are driving it from a slider, let the input coalesce to frames (a pointer-driven `onChange` already does) rather than writing on every event.
424
441
 
425
442
  **If you call Glaze directly, tell the kit.** `glaze.configure({ darkTone })` and friends invalidate Glaze's own caches, but the kit's token maps are memoized against the palette config version:
426
443
 
package/docs/Usage.md CHANGED
@@ -69,7 +69,7 @@ Defined in `src/tokens/sizes.ts`. Used for component heights and icon sizes.
69
69
 
70
70
  ## Shadow Tokens
71
71
 
72
- Defined in `src/tokens/shadows.ts`. Shadow colors (`#shadow-sm`, `#shadow-md`, `#shadow-lg`) are generated by Glaze and adapt automatically to dark / high-contrast schemes.
72
+ Defined in `src/tokens/shadows.ts`. Shadow colors (`#shadow-sm`, `#shadow-md`, `#shadow-lg`) are generated by Glaze and adapt automatically to dark / high-contrast schemas.
73
73
 
74
74
  | Token | Value |
75
75
  | ---------------- | ------------------------- |
@@ -92,26 +92,41 @@ Defined in `src/tokens/layout.ts`.
92
92
 
93
93
  All color tokens use `#name` syntax in styles. Opacity variants use `#name.NN` (e.g. `#surface-text.06` for 6% opacity).
94
94
 
95
- The palette is generated by [`@tenphi/glaze`](https://github.com/tenphi/glaze) (see `src/tokens/palette.ts`). Every color token is emitted as a state map with `light`, `@dark`, and `@hc` (high-contrast) variants, so the entire UI Kit adapts to dark / high-contrast schemes automatically.
95
+ The palette is generated by [`@tenphi/glaze`](https://github.com/tenphi/glaze) (see `src/tokens/palette.ts`). Every color token is emitted as a state map with `light`, `@dark`, and `@hc` (high-contrast) variants, so the entire UI Kit adapts to dark / high-contrast schemas automatically.
96
96
 
97
97
  The seeds it is generated from — brand hue, saturation, per-status hues, `pastel`, `contrastLevel` — are tunable at runtime. See [Theming](./Theming.md).
98
98
 
99
- ### Color Schemes
99
+ ### Color Schemas
100
100
 
101
101
  The `@dark` and `@hc` predefined states are wired up in `src/components/Root.tsx` to support both an attribute opt-in and the user's system preference:
102
102
 
103
103
  ```html
104
- <!-- Force dark scheme -->
104
+ <!-- Force dark schema -->
105
105
  <html data-schema="dark">
106
106
 
107
- <!-- Force high-contrast scheme -->
107
+ <!-- Force high-contrast schema -->
108
108
  <html data-contrast="high">
109
109
 
110
110
  <!-- Both can be combined -->
111
111
  <html data-schema="dark" data-contrast="high">
112
112
  ```
113
113
 
114
- When the attribute is absent, the scheme falls back to `@media (prefers-color-scheme: dark)` and `@media (prefers-contrast: more)`.
114
+ When the attribute is absent, the schema falls back to `@media (prefers-color-scheme: dark)` and `@media (prefers-contrast: more)`.
115
+
116
+ #### Reading the schema from JS
117
+
118
+ For styling, use the state map — `{ '': light, '@dark': dark, '@hc': hc }`. Two cases it cannot serve: a surface the stylesheet never reaches (a Vega spec, a CodeMirror / Monaco theme, an iframe), and a control whose value _is_ the ambient condition (a Light/Dark preview selector). For those, read the same two conditions from JS:
119
+
120
+ ```tsx
121
+ import { useHighContrast, useSchema } from '@cube-dev/ui-kit';
122
+
123
+ const schema = useSchema(); // 'light' | 'dark' — the JS answer to `@dark`
124
+ const isHighContrast = useHighContrast(); // boolean — the JS answer to `@hc`
125
+ ```
126
+
127
+ Both follow the attribute opt-in first and the media query second, exactly as the states do, and re-render when either changes. Outside React: `resolveSchema()`, `resolveHighContrast()` and `subscribeSchema(listener)` (fires on either condition; re-read in the listener). This is the conditions half of the gap [`resolveTokenValue()`](#resolving-tokens-outside-css) closes for token _values_.
128
+
129
+ Root-level only — there is no element-scoped or generic state reader, on purpose. Tasty's state vocabulary mixes element-local states (`hovered`, `pressed`, `disabled`) with ambient ones (`@media(…)`, `@root(…)`), and only the ambient half is answerable without an element.
115
130
 
116
131
  ### Surface & Text Vocabulary
117
132
 
@@ -154,7 +169,7 @@ Tokens a **container** sets to steer a component that cannot resolve the color o
154
169
 
155
170
  ```jsx
156
171
  <Block fill="#fixed-dark" color="#white" styles={{ '#current-fill': '#fixed-dark' }}>
157
- <Button theme="current" type="primary">Legible in both schemes</Button>
172
+ <Button theme="current" type="primary">Legible in both schemas</Button>
158
173
  </Block>
159
174
  ```
160
175
 
@@ -162,7 +177,7 @@ Setting it moves the label, the icon slots and the chip's rim together. It also
162
177
 
163
178
  ### Accent System
164
179
 
165
- Each themed color (default, primary, success, danger, warning, note) provides an `accent-*` family anchored to a fixed white "accent surface text". These tokens stay recognizable across schemes (used for branded buttons, CTAs, etc.):
180
+ Each themed color (default, primary, success, danger, warning, note) provides an `accent-*` family anchored to a fixed white "accent surface text". These tokens stay recognizable across schemas (used for branded buttons, CTAs, etc.):
166
181
 
167
182
  | Token (default theme; prefixed in others) | Role |
168
183
  | --- | --- |
@@ -203,10 +218,10 @@ resetPaletteConfig();
203
218
 
204
219
  Also available: `getPaletteConfig()`, `subscribePaletteConfig()`, the `usePaletteConfig()` hook, a `<Root palette={…}>` prop, `DEFAULT_PALETTE_CONFIG`, and `invalidatePaletteTokens()` for when you drive `glaze.configure(...)` yourself after mount. The palette is process-global — one palette per process, not per tree or per request.
205
220
 
206
- To theme a _region_ instead of the document — a theme preview, or a dark panel inside a light page — use `renderColorTokens()`. It resolves one config and one scheme to flat values you apply via a `tokens` prop, without touching the live palette:
221
+ To theme a _region_ instead of the document — a theme preview, or a dark panel inside a light page — use `renderColorTokens()`. It resolves one config and one schema to flat values you apply via a `tokens` prop, without touching the live palette:
207
222
 
208
223
  ```tsx
209
- <Block tokens={renderColorTokens({ accent: { hue: 210 }, scheme: 'dark' })} fill="#surface">
224
+ <Block tokens={renderColorTokens({ accent: { hue: 210 }, schema: 'dark' })} fill="#surface">
210
225
 
211
226
  </Block>
212
227
  ```
@@ -325,7 +340,9 @@ resolveTokenValues(['#surface', '#surface-text', '#border']); // keyed by the to
325
340
  resolvePresetValues('s3'); // { fontFamily: 'ui-monospace, …', fontSize: '14px', lineHeight: '20px', … }
326
341
  ```
327
342
 
328
- `useTokenValue()`, `useTokenValues()` and `usePresetValues()` are the same three readers as hooks, re-resolved whenever the palette is re-seeded or the scheme / contrast tier flips. The object `useTokenValues()` returns keeps its identity while the values do, so it is safe as a dependency of the theme object built from it.
343
+ `useTokenValue()`, `useTokenValues()` and `usePresetValues()` are the same three readers as hooks, re-resolved whenever the palette is re-seeded or the schema / contrast tier flips. The object `useTokenValues()` returns keeps its identity while the values do, so it is safe as a dependency of the theme object built from it.
344
+
345
+ These resolve token _values_. For the ambient _conditions_ themselves — which schema and contrast tier the document is in — see [Reading the schema from JS](#reading-the-schema-from-js).
329
346
 
330
347
  So these helpers do not inspect the value. They read `$tokens-applied`, a marker the token block declares alongside the tokens, which answers the question that matters — _are the kit's tokens in effect on this element?_ Off that surface every read returns `null` (or `fallback`) and warns once in development; on it, the computed value is taken as the truth.
331
348
 
@@ -55,7 +55,7 @@ Inherits all styling from `Item`. See [Item documentation](./Item.md) for sub-el
55
55
 
56
56
  ### Themes
57
57
 
58
- Use the `theme` prop to apply a semantic color scheme:
58
+ Use the `theme` prop to apply a semantic color schema:
59
59
 
60
60
  - `default` — Standard card appearance
61
61
  - `success` — Green theme for positive outcomes
@@ -28,7 +28,7 @@ Supports [Base properties](../../BaseProperties.md).
28
28
 
29
29
  ## Theme
30
30
 
31
- Syntax colors are driven by a dedicated, scheme-aware palette of `code-*` tokens. Each token uses a different hue so token classes stay visually separable, and every token meets at least **WCAG AA (4.5:1)** contrast against `#surface` in light, dark, and high-contrast schemes (AAA in HC).
31
+ Syntax colors are driven by a dedicated, schema-aware palette of `code-*` tokens. Each token uses a different hue so token classes stay visually separable, and every token meets at least **WCAG AA (4.5:1)** contrast against `#surface` in light, dark, and high-contrast schemas (AAA in HC).
32
32
 
33
33
  | Token | Hue | Used for |
34
34
  | --- | --- | --- |
@@ -40,7 +40,7 @@ Syntax colors are driven by a dedicated, scheme-aware palette of `code-*` tokens
40
40
  | `#code-function` | pink | functions, class names, regex, variables |
41
41
  | `#code-attribute` | cyan | attribute names, properties, selectors, built-ins, keys |
42
42
 
43
- Diff insertion (`+`) and deletion (`-`) intentionally re-use the existing `#success-*` / `#danger-*` ramps — both the line background tint and the foreground color adapt to the active scheme.
43
+ Diff insertion (`+`) and deletion (`-`) intentionally re-use the existing `#success-*` / `#danger-*` ramps — both the line background tint and the foreground color adapt to the active schema.
44
44
 
45
45
  ## Examples
46
46
 
@@ -371,7 +371,7 @@ A stale order is safe: keys for columns that no longer exist are ignored, and a
371
371
 
372
372
  `column.color` tints a whole column — header, cells and pinned totals. It takes a palette theme name, any CSS color, a `{ hue, saturation }` seed, or a `{ fill, text }` pair for full manual control.
373
373
 
374
- Every form but the last is _derived_: only the hue and saturation are kept, and the tone ramp plus an AA/AAA text floor are re-solved for light, dark and high-contrast. A column cannot end up unreadable in a scheme nobody checked.
374
+ Every form but the last is _derived_: only the hue and saturation are kept, and the tone ramp plus an AA/AAA text floor are re-solved for light, dark and high-contrast. A column cannot end up unreadable in a schema nobody checked.
375
375
 
376
376
  ```tsx
377
377
  const columns = [
@@ -310,7 +310,7 @@ The trigger button supports various visual styles via the `type` prop:
310
310
 
311
311
  ### Trigger Button Themes
312
312
 
313
- Control the color scheme with the `theme` prop:
313
+ Control the color schema with the `theme` prop:
314
314
 
315
315
  - **`default`** — Standard theme (default)
316
316
  - **`danger`** — Red/destructive color (also applied automatically when `isInvalid` is set)